create or replace PROCEDURE APURAC_GESDIRETA_CENTRAL (
      P_CDFILIAL    IN FILIAL.CDFILIAL%TYPE,
      P_CDCLIENTE   IN CLIENTE.CDCLIENTE%TYPE,
      P_DATAINI     IN DATE,
      P_DATAFIM     IN DATE,
      P_NRAPURACFAT IN NOTAFISCAL.NRAPURACFAT%TYPE,                    
      P_IDGERANOTA  IN VARCHAR DEFAULT 'S',
      P_DTSAIDAPUR  IN DATE DEFAULT NULL,
      P_CDTIPOOPER  IN VARCHAR DEFAULT '01',
      P_GERAPREVIA  IN VARCHAR DEFAULT 'S') AS

   /*DECLARACAO DO TIPO (RECORD) QUE CONTERA OS DADOS DO CURSOR PARA ITENS DA NF*/
   TYPE CURS_APURAC_RECTYPE IS RECORD (
      NRAPURACFAT     NOTAFISCAL.NRAPURACFAT%TYPE,
      CDFILIAL        FILIAL.CDFILIAL%TYPE,
      CDCLIENTE       CLIENTE.CDCLIENTE%TYPE,
      CDSERVFILI      SERVICO.CDSERVFILI%TYPE,
      CDTURNO         EFECLIFATTUR.CDTURNO%TYPE,
      VRPRECOUNIT     NUMBER,
      CDPRODUTO       PRODUTO.CDPRODUTO%TYPE,
      DSPRODUTO       VARCHAR2(400),
      CDARVPROD       PRODUTO.CDARVPROD%TYPE,
      NMPRODUTO       PRODUTO.NMPRODUTO%TYPE,
      NREFETIVOS      NUMBER,
      NMSERVICO       SERVICO.NMSERVICO%TYPE,
      CDGRSERVFAT     VARCHAR2(3),
      CDTIPOOPER      TIPOOPERAC.CDTIPOOPER%TYPE,
      VRDESCONTO      NUMBER,
      DSJUSTIFICATIVA VARCHAR2(400),
      NRGRUPONF       NUMBER,
      NRPEDIDO        VARCHAR2(10),
      NRITEMPED       VARCHAR2(10),
      IDTABELA          VARCHAR2(2),
      UTILSERVEQUI    VARCHAR2(1)
   );
   TYPE CURS_APURAC_CURTYPE IS REF CURSOR RETURN CURS_APURAC_RECTYPE;

   /* VARI�?VEIS QUE CONTERÃO O CURSOR E O REGISTRO */
   CURS_APURAC     CURS_APURAC_CURTYPE;
   REC_CURS_APURAC CURS_APURAC_RECTYPE;

   /* VARI�?VEIS PARA CONTROLE DE APURAÇÃO */
   V_CDFILIAPUR              CTRLAPURFAT.CDFILIAPUR%TYPE;
   V_FILIPROC                CTRLAPURFAT.CDFILIAPUR%TYPE; 
   V_INSERE_CTRLAPUR         VARCHAR2(01);
   V_APURA                   VARCHAR2(01);
   V_DTINIAPURAC             DATE;
   V_DTFIMAPURAC             DATE;
   V_NRAPURAGREGADA          VARCHAR2(20); --NOTAFISCAL.NRAPURACFAT%TYPE;
   V_IDBLOQUEADO             VARCHAR2(01);

   /* VARI�?VEIS PARA CONTROLE DE PARAMETROS */
   STIDTIPNFEMP      VARCHAR2(01);
   STIDUTEFEPLA      VARCHAR2(01);
   V_IDCOPALTEFEPLA  PARAMFILIAL.IDCOPALTEFEPLA%TYPE;
   V_CDTIPOFATUR     PARAMFILIAL.CDTIPOFATUR%TYPE;

   /*VARIAVEIS PARA CONTROLE DE NOTA FISCAL*/
   V_TTITENSNF               NUMBER;
   V_CONTITEM                NUMBER;
   V_CDSERVFILI              SERVICO.CDSERVFILI%TYPE;
   V_CDGRSERVFAT             VARCHAR2(03);
   V_NRGRUPONF               NUMBER;
   V_SEQUENCIAL              NUMBER;

   V_CDTIPOOPER              VARCHAR2(02);
   V_CDSERIE                 SERIENF.CDSERIE%TYPE;
   V_IDSERIEAUTO             VARCHAR2(01);
   V_CDEMPRESA               FILIAL.CDEMPRESA%TYPE;
   V_CDINSCMUNI              FILIAL.CDINSCMUNI%TYPE;
   V_CDINSCESTA              FILIAL.CDINSCESTA%TYPE;
   V_DSAJUCTREC              AJCTRECEBER.DSAJUSTEREC%TYPE;
   V_IDUTPROPEMIS            VARCHAR2(01);
   V_CDPRODPRESTSERV         VARCHAR2(10);
   V_CDAJUSTPADR             VARCHAR2(02);
   V_DESCDOTACAO             VARCHAR2(01);
   V_CDENCREDITO             VARCHAR2(02);
   V_CDENCDEBITO             VARCHAR2(02);
   V_VRCREDIDEBI             NOTAFISCAL.VRNOTAFISC%TYPE;
   V_ENCARGO                 ENCARGO.CDENCARGO%TYPE;
   V_CDGRUPOFISC             VARCHAR2(03);
   V_NREFETIVOS_SERV         FLOAT(126);
   V_VRSERVICO_SERV          FLOAT(126);
   V_CDSERVFILIAPGD          VARCHAR2(05);
   V_VRUNITARIO              NUMBER;

   V_NRLANCTONF              VARCHAR2(20);
   V_PRXLANCESTQ             VARCHAR2(10);
   V_IDTPIJURTRAN            CLIENTE.IDTPIJURTRAN%TYPE;
   v_NRINSJURTRAN            CLIENTE.NRINSJURTRAN%TYPE;
   V_IDPGTOFRETE             CLIENTE.IDPGFRETTRANCLI%TYPE;
   V_NRPLACAVEIC             VIATURA.NRPLACA%TYPE;
   V_SGUFVEICULO             VIATURA.SGUFVEICULO%TYPE;
   V_CDARVPROD               PRODUTO.CDARVPROD%TYPE;
   V_NMPRODUTO               PRODUTO.NMPRODUTO%TYPE;
   V_IDNOVANOTA              VARCHAR2(01);
   V_CDCLIENTE               VARCHAR2(21);

   V_QTPRODFATU NUMBER; /*Variavel retorna se o produto será faturado por n produtos */
   V_CONTPRODFATURAM NUMBER; /*variavel para contar qdte de produtos inseridos e arredondar no �ltimo*/
   V_SOMAPRODFATURAM FLOAT; /*variavel para contar valor unitario acumulado dos produtos inseridos e aplicar diferen�a no ultimo*/
   V_VRPRODFATURAM FLOAT; /*variavel para corrigir o valor unitario do produto rateado quando arredondado*/

   /*PROCEDIMENTO QUE ABRE O CURSOR PARA OS ITENS DAS NFS*/
   PROCEDURE OPENCURSAPURAC (CURS_APURAC IN OUT CURS_APURAC_CURTYPE) IS
   BEGIN
      OPEN CURS_APURAC FOR
         /*RETORNA TODOS ITENS APURADOS PARA GERA��O DE NF*/
         SELECT A.NRAPURAC AS NRAPURACFAT, A.CDFILIAL, A.CDCLIENTE, A.CDSERVFILI, A.CDTURNO, A.VRPRECOUNIT, A.CDPRODUTO, A.DSPRODUTO, P.CDARVPROD, P.NMPRODUTO, 
                SUM(A.NREFETIVOS) AS NREFETIVOS, A.NMSERVICO,NVL(A.CDGRSERVFAT, ' ') AS CDGRSERVFAT, A.CDTIPOOPER, A.VRDESCONTO, A.DSJUSTIFICATIVA, A.NRGRUPONF, 
                A.NRPEDIDO, A.NRITEMPED, A.IDTABELA, A.UTILSERVEQUI
           FROM(SELECT NRAPURACENTRAL AS NRAPURAC, CDFILIALCENTRAL AS CDFILIAL, CDCLIENTEAPGD AS CDCLIENTE, CDSERVFILIAPGD AS CDSERVFILI, NULL AS CDTURNO,
                       VRPRECUNITAPGD AS VRPRECOUNIT, CDPRODUTOAPGD AS CDPRODUTO, DSPRODEMISAPGD AS DSPRODUTO, NREFETIVOSAPGD AS NREFETIVOS,
                       NMSERVICOGD AS NMSERVICO, CDGRSERVFAT, CDTIPOOPER, VRDESCONTO,
                       DSJUSTIFICATIVA, NRGRUPONF, NRPEDIDO, NRITEMPED, IDTABELA, IDUTILEQUIGD AS UTILSERVEQUI
                  FROM TRAB_APURAC_GD
                 WHERE CDFILIALCENTRAL = P_CDFILIAL AND NRAPURACENTRAL = P_NRAPURACFAT
                UNION ALL
                SELECT NRAPURACENTRAL AS NRAPURAC, CDFILIALCENTRAL AS CDFILIAL, CDCLIENTEAPTU AS CDCLIENTE, CDSERVFILIAPTU AS CDSERVFILI, CDTURNOTU AS CDTURNO,
                       VRPRECUNITAPTU AS VRPRECUNITAPGD, CDPRODUTOAPTU AS CDPRODUTO, DSPRODEMISAPTU AS DSPRODUTO, NREFETIVOSAPTU AS NREFETIVOS,
                       NMSERVICOTU AS NMSERVICO, CDGRSERVFAT, CDTIPOOPER, VRDESCONTO,
                       DSJUSTIFICATIVA, NRGRUPONF, NRPEDIDO, NRITEMPED, IDTABELA, IDUTILEQUITU AS UTILSERVEQUI
                  FROM TRAB_APURAC_TU
                 WHERE CDFILIALCENTRAL = P_CDFILIAL AND NRAPURACENTRAL = P_NRAPURACFAT
               ) A INNER JOIN PRODUTO P ON P.CDPRODUTO = A.CDPRODUTO
         GROUP BY A.NRAPURAC, A.CDFILIAL, A.CDCLIENTE, A.CDSERVFILI, A.CDTURNO, A.VRPRECOUNIT, A.CDPRODUTO, A.DSPRODUTO, P.CDARVPROD, P.NMPRODUTO, 
                  A.NMSERVICO,NVL(A.CDGRSERVFAT, ' '), A.CDTIPOOPER, A.VRDESCONTO, A.DSJUSTIFICATIVA, A.NRGRUPONF, 
                  A.NRPEDIDO, A.NRITEMPED, A.IDTABELA, A.UTILSERVEQUI
         ORDER BY A.CDCLIENTE, A.NRGRUPONF;
   END OPENCURSAPURAC;
BEGIN

   /* FILIAL QUE EST�? SENDO APURADA (P_FILIAL = FILIPROC)*/
   SELECT MAX(CDFILIAPUR)
   INTO V_CDFILIAPUR
   FROM CTRLAPURFAT
   WHERE CDFILIAL    = P_CDFILIAL AND
         NRAPURACFAT = P_NRAPURACFAT;

   /*GERA TRAB_APURAC*/
   IF NVL(P_GERAPREVIA,'S') <> 'N' THEN
     /*EXECUTA A PROCEDURE APURAC_GESDIRETA PARA A FILIAL CENTRAL*/
      APURAC_GESDIRETA(P_CDFILIAL,
                       P_CDCLIENTE,
                       P_DATAINI,
                       P_DATAFIM,
                       P_NRAPURACFAT,
                       'N',   /*A NOTA � GERADA AP�S CALCULAR O FATURAMENTO DE TODAS AS FILIAIS AGREGADAS*/
                       P_DTSAIDAPUR,
                       P_CDTIPOOPER,
                       '',
                       NVL(P_GERAPREVIA,'S'),
                       P_CDFILIAL,
                       P_NRAPURACFAT); /*NUMERO DA CENTRAL*/

      /*APURA APENAS AS AGREGADAS QUE POSSUEM OS MESMOS CLIENTES DA CENTRAL*/
      FOR C_AGREGADA IN (SELECT CL.CDFILIAL
                           FROM FILIAL FI, CLIENFILIAL CL
                          WHERE FI.CDFILCENTRALFATU  = V_CDFILIAPUR
                            AND FI.CDFILIAL          = CL.CDFILIAL
                            AND CL.CDCLIENTE         = P_CDCLIENTE) LOOP

         V_INSERE_CTRLAPUR := 'N';
         V_APURA := 'N';

         BEGIN
            SELECT MAX(C.DTINIAPURAC), MAX(C.DTFIMAPURAC), MAX(C.NRAPURACFAT), NVL(MAX(N.IDBLOQUEADO),'N'), MAX(C.CDFILIAL)
              INTO V_DTINIAPURAC, V_DTFIMAPURAC, V_NRAPURAGREGADA, V_IDBLOQUEADO, V_FILIPROC
            FROM CTRLAPURFAT C, NOTAFISCAL N
            WHERE C.CDCLIENTE      = P_CDCLIENTE     AND
                  C.CDFILIAPUR     = C_AGREGADA.CDFILIAL      AND
                  N.CDFILIAL(+)    = C.CDFILIAL    AND
                  N.NRAPURACFAT(+) = C.NRAPURACFAT AND
                  C.DTINIAPURAC = (SELECT MAX(DTINIAPURAC)
                                   FROM CTRLAPURFAT
                                   WHERE CDCLIENTE    = P_CDCLIENTE AND
                                         CDFILIAPUR   = C_AGREGADA.CDFILIAL  AND
                                         NVL(CDTIPOFATUCT,'001') = '001');
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_INSERE_CTRLAPUR := 'S';
         END;
         
         IF V_FILIPROC IS NULL THEN 
            V_INSERE_CTRLAPUR := 'S'; 
         END IF; 
         /*CALCULA O PERIODO DE APURACAO DA AGREGADA APENAS SE EXISTIR REGISTRO NA CTRLAPURFAT*/
         IF NVL(V_INSERE_CTRLAPUR,'S') = 'N' THEN

            /*SE A DATA INICIAL DA AGREGADA FOR MAIOR OU IGUAL DATA INICIAL DE APURACAO E A FINAL FOR IGUAL A DATA FINAL DE APURACAO
              E O PERIODO DA AGREGADA ESTIVER BLOQUEADO, A AGREGADA N�O SERA APURADA,
              SE NAO ESTIVER BLOQUEADO AI SERA APURADA A DATA INICIAL DA AGREGADA ATE A DATA FINAL DA AGREGADA*/
            /*SE A DATA INICIAL DA AGREGADA FOR MAIOR OU IGUAL A DATA INICIAL DE APURACAO E A FINAL FOR MENOR E O PERIODO DA AGREGADA ESTIVER BLOQUEADO,
              A AGREGADA SERA APURADA CONSIDERANDO A DATA FINAL DA AGREGADA + 1, AT� A DATA FINAL DE APURACAO(P_DATAIFIM)
              SE TIVER DESBLOQUEADO, A APURACAO SERA A PARTIR DA DATA INICIAL DA AGREGADA ATE A DATA FINAL DE APURACAO*/
            /*CASOS, 0, 1,2*/
            IF (V_DTINIAPURAC >= P_DATAINI) AND (V_DTFIMAPURAC <= P_DATAFIM) THEN
                IF (V_IDBLOQUEADO = 'S') AND (V_DTFIMAPURAC < P_DATAFIM) THEN
                   V_DTINIAPURAC := V_DTFIMAPURAC+1;
                   V_DTFIMAPURAC := P_DATAFIM;
                   V_APURA := 'S';
                   /*INSERE REGISTRO NA CTRLAPURFAT, APENAS COM A DIFERENCA DOS DIAS DO PERIODO DA AGREGADA E DA CENTRAL*/
                   V_INSERE_CTRLAPUR := 'S';
                ELSE
                   IF (V_IDBLOQUEADO = 'N') THEN
                      V_DTFIMAPURAC := P_DATAFIM;
                      V_APURA := 'S';
                   END IF;
                END IF;
            END IF;

            /*SE DATA INICIAL AGREGADA >= DATA INICIAL APURACAO E DATA FINAL AGREGADA > DATA FINAL APURACAO E PERIODO DA AGREGADA BLOQUEADO, A AGREGADA NAO � APURADA
            /*SE TIVER DESBLOQUEADO O PERIODO A SER APURADO � DATA INICIAL DA AGREGADA ATE DATA FINAL APURACAO.
            /*SE DATA INICIAL AGREGADA > DATA FINAL DA APURACAO, AI NAO APURA A AGREGADA.
            /*CASOS, 3, 4*/
            IF (V_DTINIAPURAC >= P_DATAINI) AND (V_DTFIMAPURAC > P_DATAFIM) THEN
                IF (V_IDBLOQUEADO = 'N') THEN
                   V_DTFIMAPURAC := P_DATAFIM;
                   V_APURA := 'S';
                END IF;
            END IF;

            /*SE DATA INICIAL AGREGADA < DATA INICIAL APURACAO E DATA FINAL AGREGADA < DATA FINAL APURACAO E PERIODO DA AGREGADA BLOQUEADO,
               O PERIODO DE APURA��O DA AGREGADA SERA A DATA FINAL DA AGREGADA + 1 ATE A DATA FINAL APURACAO,
               SE TIVER DESBLOQUEADO O PERIODO A SER APURADO � DATA INICIAL APURACAO ATE DATA FINAL APURACAO.*/
            /*SE A DATA FINAL AGREGADA < DATA INICIAL APURACAO, AI SERA APURADO O PERIODO DE APURA��O INFORMADO NA TELA*/
            /*caso 7, 8, 9, 10*/
            IF (V_DTINIAPURAC < P_DATAINI) AND (V_DTFIMAPURAC < P_DATAFIM) THEN
                IF (V_IDBLOQUEADO = 'S') THEN
                      V_DTINIAPURAC := V_DTFIMAPURAC+1;
                      V_DTFIMAPURAC := P_DATAFIM;
                      /*INSERE REGISTRO NA CTRLAPURFAT, APENAS COM A DIFERENCA DOS DIAS DO PERIODO DA AGREGADA E DA CENTRAL*/
                      V_INSERE_CTRLAPUR := 'S';                
                ELSE
                   V_DTINIAPURAC := P_DATAINI;
                   V_DTFIMAPURAC := P_DATAFIM;
                END IF;
                V_APURA := 'S';
            END IF;

            /*SE DATA INICIAL < DATA INICIAL APURACAO E DATA FINAL >=  DATA FINAL APURACAO, SE ESTIVER BLOQUEADO, NAO APURA A AGREGADA
            /*SE NAO ESTIVER BLOQUEADO, A APURACAO SERA PELO PERIODO DE APURA��O INFORMADO NA TELA*/
            /*CASO 11,12*/
            IF (V_DTINIAPURAC < P_DATAINI) AND (V_DTFIMAPURAC >= P_DATAFIM) THEN
                IF (V_IDBLOQUEADO = 'N') THEN
                   V_DTINIAPURAC := P_DATAINI;
                   V_DTFIMAPURAC := P_DATAFIM;
                   V_APURA := 'S';
                END IF;
            END IF;
         ELSE
            V_DTINIAPURAC := P_DATAINI;
            V_DTFIMAPURAC := P_DATAFIM;
            V_APURA := 'S';
         END IF;

         /*EXECUTA A PROCEDURE APURAC_GESDIRETA PARA AS FILIAIS AGREGADAS QUE EST�O DENTRO DO PERIODO DE APURACAO DA CENTRAL*/
         IF V_APURA = 'S' THEN

             IF V_INSERE_CTRLAPUR = 'S' THEN
                NOVO_CODIGO('APURACFATUR'||P_CDFILIAL, V_NRAPURAGREGADA);
                V_NRAPURAGREGADA := SUBSTR(V_NRAPURAGREGADA,11,10);

               /*INSERE O PERIODO DE FATURAMENTO DA AGREGADA*/
               INSERT INTO CTRLAPURFAT
               (CDFILIAL, NRAPURACFAT, CDCLIENTE, DTINIAPURAC, DTFIMAPURAC, CDFILIAPUR, CDTIPOFATUCT, CDFILIALCENTRAL, NRAPURACENTRAL)
               VALUES
               (P_CDFILIAL, V_NRAPURAGREGADA, P_CDCLIENTE, V_DTINIAPURAC, V_DTFIMAPURAC, C_AGREGADA.CDFILIAL, '001', V_CDFILIAPUR, P_NRAPURACFAT);
             ELSE
               /*ATUALIZA O PERIODO DE FATURAMENTO DA AGREGADA*/
               UPDATE CTRLAPURFAT
                  SET DTINIAPURAC     = V_DTINIAPURAC,
                      DTFIMAPURAC     = V_DTFIMAPURAC,
                      CDFILIALCENTRAL = V_CDFILIAPUR,
                      NRAPURACENTRAL  = P_NRAPURACFAT
                WHERE CDFILIAPUR      = C_AGREGADA.CDFILIAL  AND
                      NRAPURACFAT     = V_NRAPURAGREGADA     AND
                      CDCLIENTE       = P_CDCLIENTE;
             END IF;

            IF NVL(V_INSERE_CTRLAPUR,'S') = 'N' THEN
               /*PASSA O CAMPO CDFILIAL DA TABELA CTRLAPURFAT, NO CASO EM QUE FOI DADO UPDATE NA MESMA */
               APURAC_GESDIRETA(V_FILIPROC,
                                P_CDCLIENTE,
                                V_DTINIAPURAC,
                                V_DTFIMAPURAC,
                                V_NRAPURAGREGADA,
                                'N',   /*A NOTA � GERADA AP�S CALCULAR O FATURAMENTO DE TODAS AS FILIAIS AGREGADAS*/
                                P_DTSAIDAPUR,
                                P_CDTIPOOPER,
                                '',
                                NVL(P_GERAPREVIA,'S'),
                                P_CDFILIAL,  /*FILIAL PROCESSAMENTO*/
                                P_NRAPURACFAT); /*NUMERO DA CENTRAL*/
            ELSE
               APURAC_GESDIRETA(P_CDFILIAL,
                                P_CDCLIENTE,
                                V_DTINIAPURAC,
                                V_DTFIMAPURAC,
                                V_NRAPURAGREGADA,
                                'N',   /*A NOTA � GERADA AP�S CALCULAR O FATURAMENTO DE TODAS AS FILIAIS AGREGADAS*/
                                P_DTSAIDAPUR,
                                P_CDTIPOOPER,
                                '',
                                NVL(P_GERAPREVIA,'S'),
                                P_CDFILIAL,  /*FILIAL PROCESSAMENTO*/
                                P_NRAPURACFAT); /*NUMERO DA CENTRAL*/
            END IF;
         END IF;
      END LOOP;

      /*ALTERA O CDFILIAL DE TODOS OS REGISTROS LIGADOS A APURACAO DA CENTRAL PARA O CODIGO DA CENTRAL*/
      UPDATE TRAB_APURAC_GD
         SET CDFILIALAPGD   = P_CDFILIAL
       WHERE NRAPURACENTRAL = P_NRAPURACFAT
         AND CDFILIALCENTRAL = P_CDFILIAL;

      UPDATE TRAB_APURAC_TU
         SET CDFILIALAPTU   = P_CDFILIAL
       WHERE NRAPURACENTRAL = P_NRAPURACFAT
         AND CDFILIALCENTRAL = P_CDFILIAL;

      /* BUSCA AS INFORMACOES PARA CADASTRAMENTO DA NOTA FISCAL */
      SELECT NVL(MAX(NRMAXITNF),10)
        INTO V_TTITENSNF
        FROM FILIAL F, SERIENF S
       WHERE F.CDFILIAL   = V_CDFILIAPUR
         AND S.CDEMPRESA  = F.CDEMPRESA
         AND S.CDINSCESTA = F.CDINSCESTA
         AND S.CDINSCMUNI = F.CDINSCMUNI
         AND S.CDSERIE    = F.CDSERIE;

      /*LOOP PARA CONFIGURA��O DE GRUPOS PARA NF DE ACORDO COM A CENTRAL*/
      V_NRGRUPONF := 0;
      V_CDGRSERVFAT := 'XXX';
      V_CONTITEM := 1;
      V_CDSERVFILI := 'XXXXX';
      V_SEQUENCIAL := 1;

      FOR C_GRUPONF IN (SELECT A.NRAPURAC, A.CDCLIENTE, A.CDSERVFILI, A.CDTURNO, A.VRPRECOUNIT, A.DSPRODUTO, A.NMSERVICO,
                               NVL(SC.CDGRSERVFAT, ' ') AS CDGRSERVFAT, NVL(S.IDSERVFATSEP,'N') AS IDSERVFATSEP, A.TABELA, A.CDFILIAGREGADA
                          FROM SERVICO S, SERVCLIE SC,
                              (SELECT NRAPURACGD AS NRAPURAC, CDCLIENTEAPGD AS CDCLIENTE, CDSERVFILIAPGD AS CDSERVFILI, NULL AS CDTURNO,
                                      VRPRECUNITAPGD AS VRPRECOUNIT, DSPRODEMISAPGD AS DSPRODUTO,
                                      NMSERVICOGD AS NMSERVICO,
                                      'GD' AS TABELA, CDFILIAGREGADA
                                 FROM TRAB_APURAC_GD
                                WHERE CDFILIALCENTRAL = P_CDFILIAL
                                  AND NRAPURACENTRAL = P_NRAPURACFAT
                               UNION ALL
                               SELECT NRAPURACTU AS NRAPURAC, CDCLIENTEAPTU AS CDCLIENTE, CDSERVFILIAPTU AS CDSERVFILI, CDTURNOTU AS CDTURNO,
                                      VRPRECUNITAPTU AS VRPRECUNITAPGD, DSPRODEMISAPTU AS DSPRODUTO,
                                      NMSERVICOTU AS NMSERVICO,
                                      'TU' AS TABELA, CDFILIAGREGADA 
                                 FROM TRAB_APURAC_TU
                                WHERE CDFILIALCENTRAL   = P_CDFILIAL
                                  AND NRAPURACENTRAL = P_NRAPURACFAT) A
                         WHERE S.CDFILIAL(+)   = V_CDFILIAPUR
                           AND S.CDSERVFILI(+) = A.CDSERVFILI
                           AND SC.CDFILIAL(+) = V_CDFILIAPUR
                           AND SC.CDSERVFILI(+) = A.CDSERVFILI
                           AND SC.CDCLIENTE(+) = A.CDCLIENTE
                        ORDER BY CDCLIENTE, NVL(SC.CDGRSERVFAT, ' ') DESC, IDSERVFATSEP ASC, CDSERVFILI
      ) LOOP


         /*SE MUDA O GRUPO PARA FATURAMENTO OU O SERVICO E PARAMETRIZADO PARA GERAR NF SEPARADA, ENTAO GERA NOVO NRGRUPONF*/
         IF (V_CONTITEM = V_TTITENSNF) OR (V_CDGRSERVFAT <> C_GRUPONF.CDGRSERVFAT) OR (C_GRUPONF.IDSERVFATSEP = 'S' AND V_CDSERVFILI <> C_GRUPONF.CDSERVFILI) THEN
            V_NRGRUPONF := V_NRGRUPONF + 1;
            V_CONTITEM := 1;
         END IF;
         IF C_GRUPONF.TABELA = 'GD' THEN
            UPDATE TRAB_APURAC_GD
               SET NRGRUPONF = V_NRGRUPONF,
                   NRSEQUENCIAL = V_SEQUENCIAL
             WHERE CDFILIALCENTRAL = P_CDFILIAL
               AND NRAPURACENTRAL = P_NRAPURACFAT
               AND CDFILIAGREGADA = C_GRUPONF.CDFILIAGREGADA
               AND CDCLIENTEAPGD  = C_GRUPONF.CDCLIENTE
               AND CDSERVFILIAPGD = C_GRUPONF.CDSERVFILI
               AND ROUND(VRPRECUNITAPGD,2) = ROUND(C_GRUPONF.VRPRECOUNIT,2)
               AND NMSERVICOGD = C_GRUPONF.NMSERVICO
               AND NVL(CDGRSERVFAT, ' ') = NVL(C_GRUPONF.CDGRSERVFAT, ' ')
               AND NVL(DSPRODEMISAPGD,' ') = NVL(C_GRUPONF.DSPRODUTO,' ');
         ELSE
            UPDATE TRAB_APURAC_TU
               SET NRGRUPONF = V_NRGRUPONF,
                   NRSEQUENCIAL   = V_SEQUENCIAL
             WHERE CDFILIALCENTRAL = P_CDFILIAL
               AND NRAPURACENTRAL = P_NRAPURACFAT
               AND CDFILIAGREGADA = C_GRUPONF.CDFILIAGREGADA
               AND CDCLIENTEAPTU  = C_GRUPONF.CDCLIENTE
               AND CDSERVFILIAPTU = C_GRUPONF.CDSERVFILI
               AND ROUND(VRPRECUNITAPTU,2) = ROUND(C_GRUPONF.VRPRECOUNIT,2)
               AND CDTURNOTU      = C_GRUPONF.CDTURNO
               AND NMSERVICOTU    = C_GRUPONF.NMSERVICO
               AND NVL(CDGRSERVFAT, ' ')    = NVL(C_GRUPONF.CDGRSERVFAT, ' ')
               AND NVL(DSPRODEMISAPTU,' ') = NVL(C_GRUPONF.DSPRODUTO,' ');
         END IF;
         V_CDGRSERVFAT := C_GRUPONF.CDGRSERVFAT;
         V_CONTITEM := V_CONTITEM + 1;
         V_CDSERVFILI := C_GRUPONF.CDSERVFILI;
         V_SEQUENCIAL := V_SEQUENCIAL + 1;
      END LOOP;
   END IF;

   /*ROTINA DE GERAR NOTA FISCAL*/
   IF NVL(P_IDGERANOTA,'S') <> 'N' THEN
      /*PEGA AS FILIAIS AGREGADAS � CENTRAL PARA ATUALIZAR EFETIVOS*/
      /*ATUALIZA APENAS A EFETCLIE DAS AGREGADAS QUE POSSUEM OS MESMOS CLIENTES DA CENTRAL*/
      FOR C_AGREGA IN (SELECT CL.CDFILIAL
                           FROM FILIAL FI, CLIENFILIAL CL
                          WHERE CDFILCENTRALFATU = V_CDFILIAPUR
                            AND FI.CDFILIAL      = CL.CDFILIAL
                            AND CL.CDCLIENTE     = P_CDCLIENTE) LOOP

         /*PEGA NO NUMERO DE APURACAO DA AGREGADA*/
         SELECT MAX(NRAPURAGREGADA)
           INTO V_NRAPURAGREGADA
           FROM
               (SELECT NRAPURACGD AS NRAPURAGREGADA
                 FROM TRAB_APURAC_GD
                WHERE CDFILIAGREGADA = C_AGREGA.CDFILIAL
                  AND NRAPURACENTRAL = P_NRAPURACFAT
               UNION ALL
               SELECT NRAPURACTU AS NRAPURAGREGADA
                 FROM TRAB_APURAC_TU
                WHERE CDFILIAGREGADA  = C_AGREGA.CDFILIAL
                  AND NRAPURACENTRAL  = P_NRAPURACFAT);

         IF V_NRAPURAGREGADA IS NOT NULL THEN

            V_FILIPROC := '';

            SELECT DTINIAPURAC, DTFIMAPURAC, CDFILIAL
              INTO V_DTINIAPURAC, V_DTFIMAPURAC, V_FILIPROC
              FROM CTRLAPURFAT
            WHERE CDFILIAPUR    = C_AGREGA.CDFILIAL  AND
                  NRAPURACFAT   = V_NRAPURAGREGADA   AND
                  CDCLIENTE     = P_CDCLIENTE;

            SELECT NVL(MAX(SUBSTR(DSPARAMFATFI,15,1)),'N'),
                   NVL(MAX(IDCOPALTEFEPLA),'N')
              INTO STIDUTEFEPLA, V_IDCOPALTEFEPLA
              FROM PARAMFILIAL
             WHERE CDFILIAL = C_AGREGA.CDFILIAL;

            IF (STIDUTEFEPLA IS NULL) OR (STIDUTEFEPLA = ' ') THEN
               STIDUTEFEPLA := 'N';
               -- NAO UTILIZA EFETIVOS DO PLANEJAMENTO
            END IF;

            /*ATUALIZA A REFERENCIA DA ULTIMA APURACAO NOS EFETIVOS DO FATURAMENTO E PLANEJAMENTO(SE CONSIDERAR)*/
            IF STIDUTEFEPLA = 'S' OR V_IDCOPALTEFEPLA = 'S' THEN
               UPDATE EFETCLIE
               SET CDFILIFATU  = NULL,
                   NRAPURACFAT = NULL
               WHERE CDFILIAL    = C_AGREGA.CDFILIAL AND
                     CDCLIENTE   = P_CDCLIENTE  AND
                     DTEFETCLIE >= V_DTINIAPURAC;

               UPDATE EFETCLIE
               SET CDFILIFATU  = V_FILIPROC,
                   NRAPURACFAT = V_NRAPURAGREGADA
               WHERE CDFILIAL   = C_AGREGA.CDFILIAL AND
                     CDCLIENTE  = P_CDCLIENTE  AND
                     DTEFETCLIE BETWEEN V_DTINIAPURAC AND V_DTFIMAPURAC;
            END IF;

            UPDATE EFECLIFAT
            SET CDFILIFATU  = NULL,
                NRAPURACFAT = NULL
            WHERE CDFILIAL   = C_AGREGA.CDFILIAL AND
                  CDCLIENTE  = P_CDCLIENTE  AND
                  DTFATURAM >= V_DTINIAPURAC;

            UPDATE EFECLIFAT
            SET CDFILIFATU  = V_FILIPROC,
                NRAPURACFAT = V_NRAPURAGREGADA
            WHERE CDFILIAL   = C_AGREGA.CDFILIAL AND
                  CDCLIENTE  = P_CDCLIENTE  AND
                  DTFATURAM BETWEEN V_DTINIAPURAC AND V_DTFIMAPURAC;
         END IF;

      END LOOP;

      SELECT NVL(MAX(SUBSTR(DSPARAMFATFI,15,1)),'N'),
             MAX(SUBSTR(DSPARAMFATFI,56,1)),          /*DESCONTO DE DOTAÇÃO*/
             MAX(SUBSTR(DSPARAMFATFI,57,2)),          /*AJUSTE PADRAO*/
             MAX(SUBSTR(DSPARAMFATFI,59,2)),          /*ENCARGO DEBITO*/
             MAX(SUBSTR(DSPARAMFATFI,61,2)),          /*ENCARGO CREDITO*/
             MAX(CDTIPOFATUR),
             MAX(IDCOPALTEFEPLA)
      INTO STIDUTEFEPLA, V_DESCDOTACAO, V_CDAJUSTPADR, V_CDENCREDITO,
           V_CDENCDEBITO, V_CDTIPOFATUR, V_IDCOPALTEFEPLA
      FROM PARAMFILIAL
      WHERE CDFILIAL = V_CDFILIAPUR;

      /* BUSCA AS INFORMAÇOES PARA CADASTRAMENTO DE AJUSTE */
      SELECT MAX(SUBSTR(DSAJUCTREC,1,20))
      INTO V_DSAJUCTREC
      FROM TIPOAJRECEBER
      WHERE V_CDAJUSTPADR = CDAJUCTREC;

      /* BUSCA OS PARAMETROS DA PARAMGERAL E PARAMFILIAL */
      SELECT MAX(SUBSTR(DSPARAMFATGE,11,1)), NVL(MAX(IDUTPROPEMIS),'N'), MAX(SUBSTR(DSPARAMFATGE,1,10))
      INTO STIDTIPNFEMP, V_IDUTPROPEMIS, V_CDPRODPRESTSERV
      FROM PARAMGERAL;

      IF V_CDTIPOFATUR = '002' THEN
         STIDTIPNFEMP := '1';

         SELECT MAX(SUBSTR(DSPARAMFATGE,12,10))
         INTO V_CDPRODPRESTSERV
         FROM PARAMGERAL;
      ELSE
         IF (STIDTIPNFEMP IS NULL) OR (RTRIM(STIDTIPNFEMP) = '') THEN
            STIDTIPNFEMP := '2';
            -- REFEIÇÃO
         END IF;
      END IF;

      /*TIPO DE OPERACAO PARA AS NFS, SERAO GRAVADAS POR DEFAULT NA TRAB_APURAC_GD E TRAB_APURAC_TU E PODEM SER ALTERADAS NA TELA DE APURACAO*/
      IF ((P_CDTIPOOPER IS NULL) OR (P_CDTIPOOPER = '') OR (P_CDTIPOOPER = ' ')) THEN
         V_CDTIPOOPER := '01';
      ELSE
         V_CDTIPOOPER := P_CDTIPOOPER;
      END IF;

      /* BUSCA AS INFORMAÇOES PARA CADASTRAMENTO DA NOTA FISCAL */
      SELECT MAX(CDEMPRESA), MAX(CDINSCMUNI), MAX(CDINSCESTA), MAX(CDSERIE)
      INTO V_CDEMPRESA, V_CDINSCMUNI, V_CDINSCESTA, V_CDSERIE
      FROM FILIAL
      WHERE CDFILIAL = V_CDFILIAPUR;

      SELECT NVL(MAX(IDSERIEAUTO), 'N')
      INTO V_IDSERIEAUTO
      FROM TIPOOPERAC
      WHERE CDTIPOOPER   = V_CDTIPOOPER AND
            IDENTRSAIDOP = 'S';

      IF V_IDSERIEAUTO = 'S' THEN
         SELECT MAX(P.CDSERIE)
         INTO V_CDSERIE
         FROM PARAMSERIE P, FILIAL F, CLIENTE C
         WHERE F.CDFILIAL      = V_CDFILIAPUR AND
               NVL(F.CDFILIFISC, F.CDFILIAL) = P.CDFILIAL   AND
               P.CDEMPRESA     = V_CDEMPRESA  AND
               P.CDINSCESTA    = V_CDINSCESTA AND
               P.CDINSCMUNI    = V_CDINSCMUNI AND
               P.CDTIPOOPER    = V_CDTIPOOPER AND
               C.CDCLIENTE     = P_CDCLIENTE  AND
               P.CDCONDICAOIVA = C.CDCONDIVACLI AND
               P.IDENTRSAIDOP  = 'S';
      END IF;

      V_VRCREDIDEBI := 0;

      SELECT SUM(VRNOTAFISC)
        INTO V_VRCREDIDEBI
        FROM NOTAFISCAL N
       WHERE (N.CDFILIAL     = V_CDFILIAPUR)                  AND
             (N.CDTIPOOPER   = '12')                          AND
             (N.IDENTRSAIDOP = 'S')                           AND
             (N.DTENTRSAID BETWEEN P_DATAINI AND P_DATAFIM);

      IF V_VRCREDIDEBI < 0 THEN
         V_VRCREDIDEBI := V_VRCREDIDEBI * (-1);
         V_ENCARGO    := V_CDENCDEBITO;
      ELSIF V_VRCREDIDEBI > 0 THEN
         V_ENCARGO    :=  V_CDENCREDITO;
      END IF;

      CONSULTA_GRUPOFISCAL('C', P_CDCLIENTE, V_CDFILIAPUR, 'S', V_CDTIPOOPER, V_CDGRUPOFISC);

      /* APAGA TODAS AS NOTAS FISCAIS APURADAS ANTERIORMENTE COM MESMO NUMERO DE APURACAO */
      FOR CURS_NF IN (SELECT CDFILIAL, NRLANCTONF
                        FROM NOTAFISCAL
                       WHERE (CDFILIAL    = P_CDFILIAL)    AND
                             (NRAPURACFAT = P_NRAPURACFAT)) LOOP
         DELETA_NF(CURS_NF.CDFILIAL, CURS_NF.NRLANCTONF);
      END LOOP;

      IF (STIDUTEFEPLA IS NULL) OR (STIDUTEFEPLA = ' ') THEN
         STIDUTEFEPLA := 'N';
         -- NAO UTILIZA EFETIVOS DO PLANEJAMENTO
      END IF;

      /*ATUALIZA A REFERENCIA DA ULTIMA APURACAO NOS EFETIVOS DO FATURAMENTO E PLANEJAMENTO(SE CONSIDERAR) PARA A FILIAL CENTRAL*/
      IF STIDUTEFEPLA = 'S' OR V_IDCOPALTEFEPLA = 'S' THEN
         UPDATE EFETCLIE
         SET CDFILIFATU  = NULL,
             NRAPURACFAT = NULL
         WHERE CDFILIAL    = V_CDFILIAPUR AND
               CDCLIENTE   = P_CDCLIENTE  AND
               DTEFETCLIE >= P_DATAINI;

         UPDATE EFETCLIE
         SET CDFILIFATU  = P_CDFILIAL,
             NRAPURACFAT = P_NRAPURACFAT
         WHERE CDFILIAL   = V_CDFILIAPUR AND
               CDCLIENTE  = P_CDCLIENTE  AND
               DTEFETCLIE BETWEEN P_DATAINI AND P_DATAFIM;

      END IF;

      UPDATE EFECLIFAT
      SET CDFILIFATU  = NULL,
          NRAPURACFAT = NULL
      WHERE CDFILIAL   = V_CDFILIAPUR AND
            CDCLIENTE  = P_CDCLIENTE  AND
            DTFATURAM >= P_DATAINI;

      UPDATE EFECLIFAT
      SET CDFILIFATU  = P_CDFILIAL,
          NRAPURACFAT = P_NRAPURACFAT
      WHERE CDFILIAL   = V_CDFILIAPUR AND
            CDCLIENTE  = P_CDCLIENTE  AND
            DTFATURAM BETWEEN P_DATAINI AND P_DATAFIM;

      /*SE FILIAL � PARAMETRIZADA PARA GERAR NF DE PRESTACAO DE SERVICO - GERA APENAS UMA NF COM UM ITEM CONSOLIDANDO OS EFETIVOS*/
      IF STIDTIPNFEMP  = '1' THEN
         SELECT SUM(NREFETIVOS), SUM(VRSERVICO), MAX(CDSERVFILI)
           INTO V_NREFETIVOS_SERV, V_VRSERVICO_SERV, V_CDSERVFILIAPGD
           FROM(SELECT NVL(NREFETIVOSAPGD,0) AS NREFETIVOS, NVL(VRPRECUNITAPGD * NREFETIVOSAPGD,0) AS VRSERVICO,
                       CDFILIALCENTRAL AS CDSERVFILI
                  FROM TRAB_APURAC_GD
                 WHERE CDFILIALCENTRAL = P_CDFILIAL    AND
                       NRAPURACENTRAL = P_NRAPURACFAT AND
                       CDCLIENTEAPGD  = P_CDCLIENTE
                UNION ALL
                SELECT NVL(NREFETIVOSAPTU,0) AS NREFETIVOS, NVL(VRPRECUNITAPTU * NREFETIVOSAPTU,0) AS VRSERVICO,
                       CDFILIALCENTRAL AS CDSERVFILI
                  FROM TRAB_APURAC_TU
                  WHERE CDFILIALCENTRAL = P_CDFILIAL AND
                        NRAPURACENTRAL = P_NRAPURACFAT AND
                        CDCLIENTEAPTU  = P_CDCLIENTE);

         IF  V_NREFETIVOS_SERV <> 0 THEN

            V_VRUNITARIO :=  V_VRSERVICO_SERV/V_NREFETIVOS_SERV;

            GERA_NOTAFISCAL_CORPO(P_CDFILIAL,     V_CDFILIAPUR, V_CDEMPRESA,
                                  V_CDTIPOOPER,   V_CDSERIE,    P_CDCLIENTE,
                                  NVL(P_DTSAIDAPUR,P_DATAFIM),
                                  'FAI',        V_NRLANCTONF,
                                  V_PRXLANCESTQ, 'N',          P_NRAPURACFAT,
                                  V_NRLANCTONF, V_IDTPIJURTRAN, V_NRINSJURTRAN,
                                  V_NRPLACAVEIC, V_SGUFVEICULO,V_IDPGTOFRETE,
                                  NULL,          NULL,         NULL,
                                  NULL,          NULL,         NULL,
                                  NULL,          NULL,         NULL,
                                  NULL,          P_DATAFIM,    NULL);

            GERA_NOTAFISCAL_DADOSADIC(P_CDFILIAL,V_NRLANCTONF,P_DATAINI,P_DATAFIM);

            /*INSERE DADOS ADICIONAIS PARAMETRIZADOS NA PREVIA DA APURACAO*/
            FOR C_DADOSADIC IN (SELECT NRDADOSADIC, CDMENSAGEM, DSMENSAGEM
                                  FROM DADOSADIC_APURAC
                                 WHERE CDFILIAL    = P_CDFILIAL AND
                                       NRAPURACFAT = P_NRAPURACFAT
            ) LOOP
               GERA_NOTAFISCAL_DADOSADIC(P_CDFILIAL,V_NRLANCTONF,P_DATAINI,P_DATAFIM, C_DADOSADIC.DSMENSAGEM, C_DADOSADIC.CDMENSAGEM);
            END LOOP;

            IF ((V_DESCDOTACAO = '1') AND (V_VRCREDIDEBI <> 0))  THEN
               GERA_NOTAFISCAL_ENCARGO(P_CDFILIAL, V_NRLANCTONF, V_ENCARGO, V_VRCREDIDEBI);
            END IF;

            SELECT MAX(CDARVPROD), MAX(NMPRODUTO)
            INTO V_CDARVPROD, V_NMPRODUTO
            FROM PRODUTO
            WHERE CDPRODUTO = V_CDPRODPRESTSERV;

            GERA_NOTAFISCAL_PRODUTO(P_CDFILIAL  , V_NRLANCTONF, V_CDPRODPRESTSERV,
                                    V_CDARVPROD , V_NMPRODUTO , V_NREFETIVOS_SERV,
                                    V_VRUNITARIO, 0           , NULL             ,
                                    NULL        , NULL        , NULL             ,
                                    NULL        , NULL        , NULL             ,
                                    NULL        , NULL        , NULL             ,
                                    'S'         , NULL        , 0                ,
                                    V_CDSERVFILIAPGD);

            GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIAL, V_NRLANCTONF);
         END IF;
      /*SE FILIAL � PARAMETRIZADA PARA GERAR NF DE REFEICAO - GERA NFS DE ACORDO COM AS PARAMETRIZACOES POR SERVICO, GRUPO DE SERVICO ETC*/
      ELSE

         V_NRGRUPONF := 0;
         V_IDNOVANOTA := 'N';
         V_CDCLIENTE := '_';
         /*CURSOR PARA TRAZER OS ITENS PARA GERA��O DAS NFS*/
         OPENCURSAPURAC (CURS_APURAC);
         LOOP
            FETCH CURS_APURAC INTO REC_CURS_APURAC;
            EXIT WHEN CURS_APURAC%NOTFOUND;
            IF (V_NRGRUPONF <> REC_CURS_APURAC.NRGRUPONF) OR (V_CDCLIENTE <> REC_CURS_APURAC.CDCLIENTE) THEN
               V_NRGRUPONF := REC_CURS_APURAC.NRGRUPONF;
               V_CDCLIENTE := REC_CURS_APURAC.CDCLIENTE;
               IF (V_IDNOVANOTA = 'S') THEN
                  GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIAL, V_NRLANCTONF);
               END IF;
               V_IDNOVANOTA := 'S';

               /*GERA NOVO CODIGO PARA NRO DE LANCAMENTO DA NF*/
               NOVO_CODIGO('LANCNF/FILIAL' || P_CDFILIAL,V_NRLANCTONF);
               V_NRLANCTONF := SUBSTR(V_NRLANCTONF,11,10);

               GERA_NOTAFISCAL_CORPO(P_CDFILIAL, V_CDFILIAPUR, V_CDEMPRESA,
                                     REC_CURS_APURAC.CDTIPOOPER, V_CDSERIE, REC_CURS_APURAC.CDCLIENTE,
                                     NVL(P_DTSAIDAPUR,P_DATAFIM),
                                     'FAI',        V_NRLANCTONF,
                                     V_PRXLANCESTQ, 'N',          P_NRAPURACFAT,
                                     V_NRLANCTONF, V_IDTPIJURTRAN, V_NRINSJURTRAN,
                                     V_NRPLACAVEIC, V_SGUFVEICULO,V_IDPGTOFRETE,
                                     NULL,          NULL,         NULL,
                                     NULL,          NULL,         NULL,
                                     NULL,          NULL,         NULL,
                                     NULL,          P_DATAFIM,    NULL);

               IF (V_DESCDOTACAO = '1') AND (V_VRCREDIDEBI <> 0) THEN
                  GERA_NOTAFISCAL_ENCARGO(P_CDFILIAL, V_NRLANCTONF, V_ENCARGO, V_VRCREDIDEBI);
               END IF;

               GERA_NOTAFISCAL_DADOSADIC(P_CDFILIAL,V_NRLANCTONF,P_DATAINI,P_DATAFIM);
               /*INSERE DADOS ADICIONAIS PARAMETRIZADOS NA PREVIA DA APURACAO*/
               FOR C_DADOSADIC IN (SELECT NRDADOSADIC, CDMENSAGEM, DSMENSAGEM
                                     FROM DADOSADIC_APURAC
                                    WHERE CDFILIAL    = P_CDFILIAL AND
                                          NRAPURACFAT = P_NRAPURACFAT AND
                                          NRGRUPONF   = V_NRGRUPONF
               ) LOOP
                  GERA_NOTAFISCAL_DADOSADIC(P_CDFILIAL,V_NRLANCTONF,P_DATAINI,P_DATAFIM, C_DADOSADIC.DSMENSAGEM, C_DADOSADIC.CDMENSAGEM);
               END LOOP;
            END IF;

            /*SE O ITEM VEM DA COMPENSACAO, ATUALIZA CONTROLE DE COMPENSACAO PARA GRAVAR A NF DO ITEM*/
            IF REC_CURS_APURAC.IDTABELA = 'CP' THEN
               UPDATE CTRLCOMPENSACAO
                  SET NRLANCTONF = V_NRLANCTONF
                WHERE CDFILIAL = P_CDFILIAL AND
                      CDSERVFILI = REC_CURS_APURAC.CDSERVFILI AND
                      NRAPURACCOMP = P_NRAPURACFAT AND
                      CDFILIAPUR = V_CDFILIAPUR;
            END IF;
            
            /*VERIFICA SE UTILIZA RATEIO DE PRODUTO PARA FATURAMENTO POR SERVICO*/
            SELECT COUNT(1), 1 AS QTDE, 0 AS VALOR
              INTO V_QTPRODFATU, V_CONTPRODFATURAM, V_SOMAPRODFATURAM
              FROM PRODFATURAM
             WHERE CDFILIAL = V_CDFILIAPUR
               AND CDSERVFILI = REC_CURS_APURAC.CDSERVFILI;

            IF V_QTPRODFATU = 0 THEN /* GERAR APENAS PRODUTO SEM RATEIO (N PRODUTO POR FATURAMENTO) */

               GERA_NOTAFISCAL_PRODUTO(P_CDFILIAL,
                                       V_NRLANCTONF,
                                       REC_CURS_APURAC.CDPRODUTO,
                                       CASE WHEN V_IDUTPROPEMIS = 'S'
                                            THEN REC_CURS_APURAC.CDARVPROD
                                            ELSE REC_CURS_APURAC.CDSERVFILI END,
                                       CASE WHEN V_IDUTPROPEMIS = 'S'
                                            THEN NVL(REC_CURS_APURAC.DSPRODUTO,REC_CURS_APURAC.NMPRODUTO)
                                            ELSE NVL(REC_CURS_APURAC.DSPRODUTO,REC_CURS_APURAC.NMSERVICO) END,
                                       REC_CURS_APURAC.NREFETIVOS,
                                       REC_CURS_APURAC.VRPRECOUNIT,
                                       REC_CURS_APURAC.VRDESCONTO   , NULL, REC_CURS_APURAC.NRPEDIDO,
                                       REC_CURS_APURAC.NRITEMPED, NULL, NULL,
                                       NULL, NULL, NULL,
                                       NULL, NULL, 'S' ,
                                       NULL, 0   , REC_CURS_APURAC.CDSERVFILI,
                                       NULL, NULL, REC_CURS_APURAC.CDSERVFILI,
                                       'N','S',0,REC_CURS_APURAC.DSJUSTIFICATIVA);

            ELSE /* O PRODUTO DE FATURAMENTO PARAMETRIZADO PARA GERAR PARA N PRODUTOS */
               FOR C_PRODFATURAM IN
                  (SELECT PF.CDPRODUTO, PD.CDARVPROD, PD.NMPRODUTO, TRUNC(REC_CURS_APURAC.VRPRECOUNIT*PF.VRPERCENTUAL/100, 2) AS VRPRODFATU
                   FROM PRODFATURAM PF, PRODUTO PD
                   WHERE PF.CDFILIAL = V_CDFILIAPUR
                     AND PF.CDSERVFILI = REC_CURS_APURAC.CDSERVFILI
                     AND PD.CDPRODUTO = PF.CDPRODUTO
               ) LOOP
                  V_SOMAPRODFATURAM := V_SOMAPRODFATURAM + C_PRODFATURAM.VRPRODFATU;
                  /*se cursor chegou ao ultimo produto, e a soma dos itens � diferente do total do servico ent�o aplica a diferen�a no valor do ultimo item*/
                  IF (V_CONTPRODFATURAM = V_QTPRODFATU) AND (REC_CURS_APURAC.VRPRECOUNIT <> V_SOMAPRODFATURAM) THEN
                     V_VRPRODFATURAM := C_PRODFATURAM.VRPRODFATU + (REC_CURS_APURAC.VRPRECOUNIT - V_SOMAPRODFATURAM);
                  ELSE
                     V_VRPRODFATURAM := C_PRODFATURAM.VRPRODFATU;
                  END IF;

                  V_CONTPRODFATURAM := V_CONTPRODFATURAM + 1;
                  GERA_NOTAFISCAL_PRODUTO(P_CDFILIAL,
                                          V_NRLANCTONF,
                                          C_PRODFATURAM.CDPRODUTO,
                                          C_PRODFATURAM.CDARVPROD,
                                          C_PRODFATURAM.NMPRODUTO,
                                          REC_CURS_APURAC.NREFETIVOS,
                                          V_VRPRODFATURAM,
                                          REC_CURS_APURAC.VRDESCONTO   , NULL, REC_CURS_APURAC.NRPEDIDO,
                                          REC_CURS_APURAC.NRITEMPED, NULL, NULL,
                                          NULL, NULL, NULL,
                                          NULL, NULL, 'S' ,
                                          NULL, 0   , REC_CURS_APURAC.CDSERVFILI,
                                          NULL, NULL, REC_CURS_APURAC.CDSERVFILI,
                                          'N','S',0,REC_CURS_APURAC.DSJUSTIFICATIVA);
               END LOOP;
            END IF;
         END LOOP;
         CLOSE CURS_APURAC;
         /* EFETUA O FECHAMENTO DA NOTA, GERACAO DE IMPOSTOS */
         IF (V_IDNOVANOTA = 'S') THEN
            GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIAL, V_NRLANCTONF);

            IF (V_DESCDOTACAO = '2') AND (V_VRCREDIDEBI <> 0) THEN
               INSERT INTO AJCTRECEBER
               (CDFILIAL,    NRLANCTONF,  DTAJUSTEREC, CDAJUCTREC,
                DSAJUSTEREC, VRAJUSTEREC, NRSEQVENREC, NRPARCELAREC)
               (SELECT MAX(CDFILIAL),  MAX(NRLANCTONF), SYSDATE , V_CDAJUSTPADR,
                       V_DSAJUCTREC,   ROUND(V_VRCREDIDEBI,2),    MAX(NRSEQVENREC), MAX(NRPARCELAREC)
                FROM CONTARECEBER
                WHERE (CDFILIAL    =  P_CDFILIAL)    AND
                      (NRLANCTONF  =  V_NRLANCTONF));
            END IF;
         COMMIT;
         END IF;
      END IF;
      /*APAGA OS REGISTROS DOS DADOS ADICIONAIS PARA A APURACAO*/
      DELETE FROM DADOSADIC_APURAC
      WHERE CDFILIAL = P_CDFILIAL AND
            NRAPURACFAT = P_NRAPURACFAT;

      /* APAGA OS REGISTROS DA TRAB_APURAC_GD DE APURACOES ANTERIORES */
      DELETE FROM TRAB_APURAC_GD
      WHERE CDFILIALCENTRAL = P_CDFILIAL    AND
            NRAPURACENTRAL = P_NRAPURACFAT;

      /* APAGA OS REGISTROS DA TRAB_APURAC_TU DE APURACOES ANTERIORES */
      DELETE FROM TRAB_APURAC_TU
      WHERE CDFILIALCENTRAL   = P_CDFILIAL    AND
            NRAPURACENTRAL = P_NRAPURACFAT;
   END IF;
END;
/