CREATE OR REPLACE PROCEDURE APURAC_REFESERV(
   P_CDFILIAPUR  IN FILIAL.CDFILIAL%TYPE,
   P_CDFILIPROC  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_NRLANCTONF  IN NOTAFISCAL.NRLANCTONF%TYPE) AS


   /* DECLARA??O DO TIPO (RECORD) QUE CONTERA OS DADOS DO CURSOR */
   TYPE GDiretaRecType IS RECORD (
    CDFILIAL       FILIAL.CDFILIAL%TYPE,
    CDCLIENTE      CLIENTE.CDCLIENTE%TYPE,
    CDSERVFILI     SERVICO.CDSERVFILI%TYPE,
    CDSERVPREQUI   SERVICO.CDSERVFILI%TYPE,
    DTFATURAM      DATE,
    CDGRSERVFAT    GRUPSERVFAT.CDGRSERVFAT%TYPE,
    CDSERAJEFEGSF  SERVICO.CDSERVFILI%TYPE,
    CDPRODUTO      PRODUTO.CDPRODUTO%TYPE,
    VRSERVICO      NUMBER,
    VRSERVFATUDT   NUMBER,
    NMSERVICO      SERVICO.NMSERVICO%TYPE,
    DSPRODEMIS     ITEMPRODUTO.DSPRODEMIS%TYPE,
    QTEFETIVOSDIA       NUMBER,
    QTEFETPERIODO       NUMBER,
    QTEFETGRUPODIA      NUMBER,
    QTEFETGRUPOPERIODO  NUMBER,
    QTDEMINIEFETDIA     NUMBER,
    QTDEMINIEFETPERIODO NUMBER);

   /* DECLARA??O DO TIPO DO CURSOR */
   TYPE GDiretaCurType IS REF CURSOR RETURN GDiretaRecType;

   /* VARI?VEIS QUE CONTERAO O CURSOR E O REGISTRO */
   Rec_GDireta    GDiretaRecType;
   Cur_GDireta    GDiretaCurType;

   /* VARI?VEIS PARA CONTROLE DE PARAMETROS */
   stIdTipNFEmp   VARCHAR2(01);
   stIdMiniEfet   VARCHAR2(01);
   stIdQtdePrec   VARCHAR2(01);
   stIdUtEfePla   VARCHAR2(01);

   /* VARI?VEIS PARA CONTROLE DE APURA??O */
   QtdeMiniEfet   EFECLIFAT.QTCOMEFATU%TYPE;
   V_QtEfetServ   NUMBER;
   V_VrServico    NUMBER;
   V_VrServFatu   NUMBER;
   V_VrPercCorr   NUMBER;
   V_Existe       NUMBER;
   V_VrServFaEq   NUMBER;
   V_VrServTotal  NUMBER;
   V_CdServFili   SERVICO.CDSERVFILI%TYPE;
   V_CdProduto    PRODUTO.CDPRODUTO%TYPE;
   V_CdProdutoEqui PRODUTO.CDPRODUTO%TYPE;
   V_NMSERVICO    SERVICO.NMSERVICO%TYPE;
   V_NMSERVICOEQ  SERVICO.NMSERVICO%TYPE;
   V_DSPRODEMIS   ITEMPRODUTO.DSPRODEMIS%TYPE;
   V_CDGRSERVFAT  VARCHAR2(03);   
   V_CDGRSERVFAT_ATUAL VARCHAR2(03);   

   /* VARIAVEIS PARA CONTROLE DE GRAVACAO DA NOTA FISCAL */
   V_CHAVECST     VARCHAR2(14);

   V_IDENDCFOP      VARCHAR2(01);
   V_PAISORIG       VARCHAR2(04);
   V_ESTAORIG       VARCHAR2(02);
   V_MUNIORIG       VARCHAR2(04);
   V_ORIGDESTOP     VARCHAR2(01);
   V_IDENDEMIS      VARCHAR2(01);
   V_PAISDEST       VARCHAR2(04);
   V_ESTADEST       VARCHAR2(02);
   V_MUNIDEST       VARCHAR2(04);
   V_CDEMPRESADEST  VARCHAR2(02);
   V_CDINSCESTADEST VARCHAR2(16);
   V_IDINTEREST     VARCHAR2(01);
   V_IDINTERNA      VARCHAR2(01);

   V_CdEmpresa    FILIAL.CDEMPRESA%TYPE;
   V_CdInscMuni   FILIAL.CDINSCMUNI%TYPE;
   V_CdInscEsta   FILIAL.CDINSCESTA%TYPE;

   V_CDEMPRATAC  EMPRESA.CDEMPRESA%TYPE;
   V_CDINSCATAC  INSCRESTAD.CDINSCESTA%TYPE;
   V_INSCMUATAC  FILIAL.CDINSCMUNI%TYPE;
   V_CDEMPROPER  EMPRESA.CDEMPRESA%TYPE;
   V_SERIEATAC   SERIENF.CDSERIE%TYPE;
   V_CDSERIE     SERIENF.CDSERIE%TYPE;
   V_INSCMUOPER  FILIAL.CDINSCMUNI%TYPE;
   V_CDINSCOPER  INSCRESTAD.CDINSCESTA%TYPE;
   V_SERIEOPER   SERIENF.CDSERIE%TYPE;

   V_NRLANCTONF  VARCHAR2(20);
   V_NRLANCESTQ  LANCTOESTOQ.NRLANCESTQ%TYPE;

   V_CDPRGENESER PRODUTO.CDPRODUTO%TYPE;
   V_NMPRGENESER PRODUTO.NMPRODUTO%TYPE;

   V_CDPRGENEREF PRODUTO.CDPRODUTO%TYPE;
   V_NMPRGENEREF PRODUTO.NMPRODUTO%TYPE;

   V_VRPERCSERV  NUMBER;
   V_VRTOTASERV  NUMBER;
   V_VRLIQUFATU  NUMBER;
   V_TTITENSNF   NUMBER;
   V_CONTITEM    NUMBER;
   V_VRNFATACA   NUMBER;

   V_CDGRUPOFISC  VARCHAR2(03);
   
   V_CDTPOPERREF PARAMGERAL.CDTPOPERREF%TYPE;
   V_CDTPOPERPRESER PARAMGERAL.CDTPOPERPRESER%TYPE;

   /* PROCEDIMENTO QUE ABRE O CURSOS DE ACORDO COM ALGUNS PARAMETROS
    PARAMETROS:
    1. CURSOR A SER ABERTO
    2. INDICADOR DA UTILIZACAO DE EFETIVOS DO PLANEJAMENTO*/
   PROCEDURE OpenGDiretaCursor (C_GDireta  IN OUT GDiretaCurType, V_UtPlanej IN VARCHAR2) IS
   BEGIN
      OPEN C_GDIRETA FOR
         SELECT DISTINCT SM.CDFILIAL,   SM.CDCLIENTE, SM.CDSERVFILI, S.CDSERVPREQUI, SM.DTFATURAM, SM.CDGRSERVFAT, GS.CDSERAJEFEGSF, SM.CDPRODUTO, SM.VRSERVICO, 
                NVL(SM.VRSERVFATUDT, 0) AS VRSERVFATUDT, S.NMSERVICO, SM.NMSERVICO AS DSPRODEMIS,
                SUM(SM.QTEFETIVOS) OVER (PARTITION BY SM.CDFILIAL, SM.CDCLIENTE, SM.CDSERVFILI, SM.DTFATURAM, SM.CDGRSERVFAT, SM.CDPRODUTO,  SM.VRSERVICO,
                                                   NVL(SM.VRSERVFATUDT, 0), S.NMSERVICO, SM.NMSERVICO) AS QTEFETIVOSDIA,
                SUM(SM.QTEFETIVOS) OVER (PARTITION BY SM.CDFILIAL, SM.CDCLIENTE,  SM.CDSERVFILI) AS QTEFETPERIODO,
                SUM(SM.QTEFETIVOS) OVER (PARTITION BY SM.CDFILIAL, SM.CDCLIENTE, SM.CDGRSERVFAT, SM.DTFATURAM) AS QTEFETGRUPODIA,
                SUM(SM.QTEFETIVOS) OVER (PARTITION BY SM.CDFILIAL, SM.CDCLIENTE, SM.CDGRSERVFAT) AS QTEFETGRUPOPERIODO,
                UTIL_APURAC.CALCEFETMINI(SM.CDFILIAL,SM.CDCLIENTE,SM.CDSERVFILI,SM.CDGRSERVFAT,SM.DTFATURAM) AS QTDEMINIEFETDIA,
                UTIL_APURAC.CALCEFETMINI(SM.CDFILIAL,SM.CDCLIENTE,SM.CDSERVFILI,SM.CDGRSERVFAT,NULL) AS QTDEMINIEFETPERIODO
          FROM SUM_EFETIVOS SM LEFT JOIN GRUPSERVFAT GS ON (SM.CDFILIAL = GS.CDFILIAL AND SM.CDCLIENTE = GS.CDCLIENTE AND GS.CDGRSERVFAT = SM.CDGRSERVFAT)
                               INNER JOIN SERVICO S ON (SM.CDFILIAL = S.CDFILIAL AND SM.CDSERVFILI = S.CDSERVFILI)
         WHERE (SM.CDFILIAL = P_CDFILIAPUR) AND 
               (SM.CDCLIENTE = P_CDCLIENTE) AND
               ((SM.IDFATUPLAN = 'F') OR (V_UTPLANEJ = 'S')) AND
               (SM.DTFATURAM BETWEEN P_DATAINI AND P_DATAFIM)
         ORDER BY SM.CDFILIAL, SM.CDCLIENTE, SM.CDSERVFILI, SM.CDGRSERVFAT, SM.DTFATURAM;
   END OPENGDIRETACURSOR;

BEGIN
   V_CHAVECST     := P_CDFILIPROC || P_NRAPURACFAT;
   V_VRLIQUFATU   := 0;
   V_VRTOTASERV   := 0;
   V_TTITENSNF    := 10;
   
   SELECT TO_NUMBER(NVL(MAX(SUBSTR(LTRIM(PF.DSPARAMFATFI),50,5)),'0')), /*Percentual de Compras/Revenda*/
          MAX(SUBSTR(PF.DSPARAMFATFI,39,2)),  /*Empresa atacadista*/
          MAX(SUBSTR(PF.DSPARAMFATFI,41,2)),  /*Empresa operacional*/
          LTRIM(RTRIM(MAX(SUBSTR(PG.DSPARAMFATGE,105,10)))), /*Codigo da Produto para Refeicao*/
          LTRIM(RTRIM(MAX(SUBSTR(PG.DSPARAMFATGE,115,10)))) /*Codigo da Produto para Servico*/
   INTO V_VRPERCSERV, V_CDEMPRATAC,  V_CDEMPROPER, V_CDPRGENESER, V_CDPRGENEREF
   FROM PARAMFILIAL PF, PARAMGERAL PG
   WHERE PF.CDFILIAL = P_CDFILIAPUR;


   V_VRPERCSERV := V_VRPERCSERV/1000;

   SELECT MAX(NMPRODUTO)
   INTO V_NMPRGENESER
   FROM PRODUTO
   WHERE CDPRODUTO  =  V_CDPRGENESER;

   SELECT MAX(NMPRODUTO)
   INTO V_NMPRGENEREF
   FROM PRODUTO
   WHERE CDPRODUTO  =  V_CDPRGENEREF;

   /* 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 = P_CDFILIAPUR;

   SELECT MAX(CDINSCMUNI), MAX(CDINSCESTA), MAX(CDSERIE)
   INTO V_INSCMUATAC, V_CDINSCATAC, V_SERIEATAC
   FROM EMPRCNTRFIL
   WHERE CDEMPRESA = V_CDEMPRATAC   AND
         CDFILIAL  = P_CDFILIAPUR;

   SELECT MAX(CDINSCMUNI), MAX(CDINSCESTA), MAX(CDSERIE)
   INTO V_INSCMUOPER, V_CDINSCOPER, V_SERIEOPER
   FROM EMPRCNTRFIL
   WHERE CDEMPRESA = V_CDEMPROPER   AND
         CDFILIAL  = P_CDFILIAPUR;

   IF V_SERIEATAC IS NULL THEN
      V_SERIEATAC    := V_CDSERIE;
      V_INSCMUATAC   := V_CDINSCMUNI;
      V_CDINSCATAC   := V_CDINSCESTA;
      SELECT NVL(MAX(NRMAXITNF),10)
      INTO V_TTITENSNF
      FROM SERIENF
      WHERE CDEMPRESA  = V_CDEMPRESA  AND
            CDINSCESTA = V_CDINSCATAC  AND
            CDINSCMUNI = V_INSCMUATAC  AND
            CDSERIE    = V_SERIEATAC;
   ELSE
      SELECT NVL(MAX(NRMAXITNF),10)
      INTO V_TTITENSNF
      FROM SERIENF
      WHERE CDEMPRESA  = V_CDEMPRATAC  AND
            CDINSCESTA = V_CDINSCATAC  AND
            CDINSCMUNI = V_INSCMUATAC  AND
            CDSERIE    = V_SERIEATAC;
   END IF;

   IF V_SERIEOPER IS NULL THEN
      V_SERIEOPER    := V_CDSERIE;
      V_INSCMUOPER   := V_CDINSCMUNI;
      V_CDINSCOPER   := V_CDINSCESTA;
   END IF;

   /*DADOS DO EMITENTE*/
   SELECT NVL(MAX(IDENDCFOPFIL),'I'), MAX(CDEMPRESA), MAX(CDINSCESTA)
   INTO   V_IDENDCFOP,                V_CDEMPRESA,    V_CDINSCESTA
   FROM   FILIAL
   WHERE  (CDFILIAL = P_CDFILIAPUR);

   IF V_IDENDCFOP = 'I' THEN
      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISORIG,  V_ESTAORIG,    V_MUNIORIG
      FROM   INSCRESTAD
      WHERE  CDEMPRESA  = V_CDEMPRESA AND
             CDINSCESTA = V_CDINSCESTA;
   ELSE
      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISORIG,  V_ESTAORIG,    V_MUNIORIG
      FROM   ENDEFILI
      WHERE  (CDFILIAL     = P_CDFILIAPUR) AND
             (IDTPENDEFILI = V_IDENDCFOP);
   END IF;

   /*DADOS DO DESTINIATARIO */
   SELECT MAX(IDORIGDESTOP)
   INTO   V_ORIGDESTOP
   FROM   TIPOOPERAC
   WHERE  IDENTRSAIDOP = 'S' AND
          CDTIPOOPER   = '01';

   IF V_ORIGDESTOP = 'L' THEN /*QUANDO O DESTINATARIO E UMA FILIAL */
      SELECT NVL(MAX(IDENDEMISFIL),'I'), MAX(CDEMPRESA), MAX(CDINSCESTA)
      INTO   V_IDENDEMIS,                V_CDEMPRESADEST,    V_CDINSCESTADEST
      FROM   FILIAL
      WHERE  (CDFILIAL = P_CDCLIENTE);

      IF V_IDENDEMIS = 'I' THEN
         SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
         INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
         FROM   INSCRESTAD
         WHERE  CDEMPRESA  = V_CDEMPRESADEST AND
                CDINSCESTA = V_CDINSCESTADEST;
      ELSE
         SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
         INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
         FROM   ENDEFILI
         WHERE  CDFILIAL     = P_CDCLIENTE AND
                IDTPENDEFILI = V_IDENDEMIS;
      END IF;
   ELSIF V_ORIGDESTOP = 'F' THEN /*QUANDO O DESTINATARIO E UM FORNECEDOR*/
      SELECT NVL(MAX(IDENDEMISFOR),'P')
      INTO   V_IDENDEMIS
      FROM   FORNECEDOR
      WHERE  (CDFORNECED = P_CDCLIENTE);

      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
      FROM   ENDEFORN
      WHERE  (CDFORNECED   = P_CDCLIENTE) AND
             (IDTPENDEFORN = V_IDENDEMIS);
   ELSE /*QUANDO O DESTINATARIO E UM CLIENTE*/
      SELECT NVL(MAX(IDENDEMISCLI),'P')
      INTO   V_IDENDEMIS
      FROM   CLIENTE
      WHERE  (CDCLIENTE = P_CDCLIENTE);

      SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
      INTO   V_PAISDEST,  V_ESTADEST,    V_MUNIDEST
      FROM   ENDECLIE
      WHERE  (CDCLIENTE    = P_CDCLIENTE) AND
             (IDTPENDECLIE = V_IDENDEMIS);
   END IF;
   /*VERIFICANDO OS PARAMETROS INTERESTADUAL E INTERNACIONAL*/
   V_IDINTEREST := 'N';
   V_IDINTERNA  := 'N';
   IF ((V_PAISDEST = V_PAISORIG) AND (V_ESTADEST <> V_ESTAORIG)) THEN
      V_IDINTEREST := 'S';
   ELSIF (V_PAISDEST <> V_PAISORIG) THEN
      V_IDINTERNA := 'S';
   END IF;

   /* APAGA OS REGISTROS DA TRAB_APURAC_GD DE APURACOES ANTERIORES */
   DELETE FROM TRAB_APURAC_GD
   WHERE CDFILIALAPGD  = P_CDFILIPROC  AND
         NRAPURACGD    = P_NRAPURACFAT AND
         CDCLIENTEAPGD = P_CDCLIENTE;

   /* BUSCA OS PARAMETROS DA PARAMGERAL E PARAMFILIAL */
   SELECT MAX(SUBSTR(DSPARAMFATGE,11,1)) INTO stIdTipNFEmp
   FROM PARAMGERAL;

   IF (stIdTipNFEmp IS NULL) OR (RTRIM(stIdTipNFEmp) = '') THEN
      stIdTipNFEmp := '2';
      -- REFEICAO
   END IF;

   SELECT MAX(SUBSTR(DSPARAMFATFI,01,1)), MAX(SUBSTR(DSPARAMFATFI,02,1)),
          MAX(SUBSTR(DSPARAMFATFI,15,1))
   INTO stIdMiniEfet, stIdQtdePrec, stIdUtEfePla
   FROM PARAMFILIAL
   WHERE CDFILIAL = P_CDFILIAPUR;

   IF (stIdMiniEfet IS NULL) OR (stIdMiniEfet = ' ') THEN
      stIdMiniEfet := '1';
      -- POR DIA
   END IF;
   IF (stIdQtdePrec IS NULL) OR (stIdQtdePrec = ' ') THEN
      stIdQtdePrec := '1';
      -- POR QUANTIDADE
   END IF;
   IF (stIdUtEfePla IS NULL) OR (stIdUtEfePla = ' ') THEN
      stIdUtEfePla := 'N';
      -- NAO UTILIZA EFETIVOS DO PLANEJAMENTO
   END IF;

   CONSULTA_GRUPOFISCAL('C', P_CDCLIENTE, P_CDFILIAPUR, 'S', '01', V_CDGRUPOFISC);

   /* ABRE O CURSOR */
   OpenGDiretaCursor(Cur_GDireta, stIdUtEfePla);
   LOOP
      FETCH Cur_GDireta INTO Rec_GDireta;
      EXIT WHEN Cur_GDireta%NOTFOUND;

      /*Conforme solicitacao 174067, caso o servico tenha valor variavel, o valor devera ser considerado independente do valor do parametro*/
      IF((REC_GDIRETA.VRSERVFATUDT IS NOT NULL) AND (REC_GDIRETA.VRSERVFATUDT <> 0)) THEN
         V_VRSERVICO  := REC_GDIRETA.VRSERVFATUDT;
      ELSE
         V_VRSERVICO  := REC_GDIRETA.VRSERVICO;
      END IF;
      V_QTEFETSERV := REC_GDIRETA.QTEFETIVOSDIA;
      V_NMSERVICO  := REC_GDIRETA.NMSERVICO;
      V_CDSERVFILI := REC_GDIRETA.CDSERVFILI;
      V_DSPRODEMIS := REC_GDIRETA.DSPRODEMIS;
      
      /* EFETUA O AJUSTE DAS QUANTIDADES OU VALORES DOS SERVICOS */ 
      IF (STIDMINIEFET = '1') THEN
         -- POR DIA
         IF (STIDQTDEPREC = '1') THEN
            -- POR DIA / QUANTIDADE
            IF (REC_GDIRETA.QTEFETIVOSDIA < REC_GDIRETA.QTDEMINIEFETDIA) AND (REC_GDIRETA.CDGRSERVFAT IS NULL) THEN
               /*SE NAO UTILIZA GRUPO DE SERVICO, ENTAO AJUSTA A QUANTIDADE DE EFETIVOS DO SERVICO NO DIA*/
               V_QTEFETSERV := REC_GDIRETA.QTDEMINIEFETDIA;
            ELSIF (REC_GDIRETA.QTEFETGRUPODIA < REC_GDIRETA.QTDEMINIEFETDIA) AND (REC_GDIRETA.CDGRSERVFAT IS NOT NULL) AND (REC_GDIRETA.CDSERVFILI = REC_GDIRETA.CDSERAJEFEGSF) THEN 
               /*SE UTILIZA GRUPO DE SERVICO, ENTAO AJUSTA A QUANTIDADE DE EFETIVOS DO SERVICO NO DIA SE O SERVICO FOR O QUE CORRIGE EFETIVOS*/
               V_QTEFETSERV := V_QTEFETSERV + (REC_GDIRETA.QTDEMINIEFETDIA - REC_GDIRETA.QTEFETGRUPODIA);
            END IF;
         ELSE 
            -- POR DIA / PRECO
            UTIL_APURAC.PRECOCORR(REC_GDIRETA.CDFILIAL,
                                  REC_GDIRETA.CDCLIENTE,
                                  REC_GDIRETA.CDSERVFILI,
                                  REC_GDIRETA.CDGRSERVFAT,
                                  CASE WHEN REC_GDIRETA.CDGRSERVFAT IS NULL
                                       THEN REC_GDIRETA.QTEFETIVOSDIA
                                       ELSE REC_GDIRETA.QTEFETGRUPODIA END,    
                                  REC_GDIRETA.QTDEMINIEFETDIA,
                                  CASE WHEN REC_GDIRETA.CDGRSERVFAT IS NULL THEN 'S' ELSE 'G' END,
                                  V_VRSERVICO,
                                  V_VRPERCCORR,
                                  'N',
                                  P_DATAINI,
                                  P_DATAFIM,
                                  STIDUTEFEPLA);
         END IF;
      /*CORRIGE POR PERIODO*/
      ELSE
         /* VERIFICA SE JA FOI GRAVADO REGISTRO PARA AJUSTE DE EFETIVOS POR PERIODO (AJUSTE SO GRAVA UMA VEZ)*/
         SELECT COUNT(*)
           INTO V_EXISTE
           FROM TRAB_APURAC_GD
          WHERE CDFILIALAPGD   = P_CDFILIPROC AND
                NRAPURACGD     = P_NRAPURACFAT AND
                CDCLIENTEAPGD  = REC_GDIRETA.CDCLIENTE AND
                CDSERVFILIAPGD = REC_GDIRETA.CDSERVFILI AND
                IDAJUSEFETAPGD = 'S';
         IF (V_EXISTE = 0) THEN /*SE AINDA NAO EXISTE REGISTRO DE AJUSTE ENTAO INSERE (IDAJUSEFETAPGD = 'S')*/
            IF (STIDQTDEPREC = '1') THEN -- POR QUANTIDADE
               
               --BUSCA MAIOR VALOR DO SERVICO PARA GRAVAR NO AJUSTE
               SELECT MAX(VRSERVFATU)
                 INTO V_VRSERVFATU
                 FROM SERVCLIE
                WHERE CDFILIAL   = REC_GDIRETA.CDFILIAL AND
                      CDCLIENTE  = REC_GDIRETA.CDCLIENTE AND
                      CDSERVFILI = REC_GDIRETA.CDSERVFILI;
               IF (V_VRSERVFATU IS NULL) THEN
                  V_VRSERVFATU := 0;
               END IF;
               IF (REC_GDIRETA.QTEFETPERIODO < REC_GDIRETA.QTDEMINIEFETPERIODO) AND (REC_GDIRETA.CDGRSERVFAT IS NULL) THEN
                  /*SE NAO UTILIZA GRUPO DE SERVICO, ENTAO AJUSTA A QUANTIDADE DE EFETIVOS DO SERVICO NO PERIODO*/
                  INSERT INTO TRAB_APURAC_GD
                     (CDFILIALAPGD, NRAPURACGD, CDCLIENTEAPGD, CDSERVFILIAPGD, DTAPURACFATGD, CDPRODUTOAPGD, NREFETIVOSAPGD, VRPRECUNITAPGD,
                      IDAJUSEFETAPGD, IDPRODSUBSGD, IDUTILEQUIGD, CDPTOVNDFATURTAP, NMSERVICOGD, DSPRODEMISAPGD, CDGRSERVFAT, IDTABELA, NRAPURACENTRAL, CDFILIALCENTRAL, CDFILIAGREGADA)
                  VALUES 
                     (P_CDFILIPROC, P_NRAPURACFAT, REC_GDIRETA.CDCLIENTE, REC_GDIRETA.CDSERVFILI, P_DATAINI, REC_GDIRETA.CDPRODUTO,
                      REC_GDIRETA.QTDEMINIEFETPERIODO - REC_GDIRETA.QTEFETPERIODO, V_VRSERVFATU, 'S', 'N', CASE WHEN REC_GDIRETA.CDSERVPREQUI IS NULL THEN 'N' ELSE 'S' END , NULL, 
                      V_NMSERVICO, V_DSPRODEMIS, REC_GDIRETA.CDGRSERVFAT, 'GD', NULL, NULL, P_CDFILIAPUR);
               /*SE UTILIZA GRUPO DE SERVICO, ENTAO AJUSTA A QUANTIDADE DE EFETIVOS DO SERVICO NO PERIODO SE O SERVICO FOR O QUE CORRIGE EFETIVOS*/   
               ELSIF (REC_GDIRETA.QTEFETGRUPOPERIODO < REC_GDIRETA.QTDEMINIEFETPERIODO) AND (REC_GDIRETA.CDGRSERVFAT IS NOT NULL) AND (REC_GDIRETA.CDSERVFILI = REC_GDIRETA.CDSERAJEFEGSF) THEN 
                  INSERT INTO TRAB_APURAC_GD
                     (CDFILIALAPGD, NRAPURACGD, CDCLIENTEAPGD, CDSERVFILIAPGD, DTAPURACFATGD, CDPRODUTOAPGD,NREFETIVOSAPGD, VRPRECUNITAPGD,
                      IDAJUSEFETAPGD, IDPRODSUBSGD, IDUTILEQUIGD, NMSERVICOGD, DSPRODEMISAPGD, CDPTOVNDFATURTAP, CDGRSERVFAT, IDTABELA, NRAPURACENTRAL, CDFILIALCENTRAL, CDFILIAGREGADA)
                  VALUES 
                     (P_CDFILIPROC, P_NRAPURACFAT, REC_GDIRETA.CDCLIENTE, REC_GDIRETA.CDSERVFILI, P_DATAINI, REC_GDIRETA.CDPRODUTO, REC_GDIRETA.QTDEMINIEFETPERIODO - REC_GDIRETA.QTEFETGRUPOPERIODO, V_VRSERVFATU,
                      'S', 'N', CASE WHEN REC_GDIRETA.CDSERVPREQUI IS NULL THEN 'N' ELSE 'S' END, V_NMSERVICO, V_DSPRODEMIS, NULL, REC_GDIRETA.CDGRSERVFAT, 'GD', NULL, NULL, P_CDFILIAPUR);
               END IF;
            ELSE /*POR PRECO*/
               IF (REC_GDIRETA.CDGRSERVFAT IS NULL) OR ((REC_GDIRETA.CDGRSERVFAT IS NOT NULL) AND (REC_GDIRETA.CDSERVFILI = REC_GDIRETA.CDSERAJEFEGSF)) THEN
                  UTIL_APURAC.PRECOCORR(REC_GDIRETA.CDFILIAL,
                                        REC_GDIRETA.CDCLIENTE,
                                        REC_GDIRETA.CDSERVFILI,
                                        REC_GDIRETA.CDGRSERVFAT,
                                        CASE WHEN REC_GDIRETA.CDGRSERVFAT IS NULL 
                                             THEN REC_GDIRETA.QTEFETPERIODO
                                             ELSE REC_GDIRETA.QTEFETGRUPOPERIODO END,
                                        REC_GDIRETA.QTDEMINIEFETPERIODO,
                                        CASE WHEN REC_GDIRETA.CDGRSERVFAT IS NULL THEN 'S' ELSE 'G' END,
                                        V_VRSERVICO,
                                        V_VRPERCCORR,
                                        'N',
                                        P_DATAINI,
                                        P_DATAFIM,
                                        STIDUTEFEPLA);
               END IF;
            END IF;
         END IF;
      END IF;
      
      V_CDPRODUTO := REC_GDIRETA.CDPRODUTO;
      V_CDGRSERVFAT_ATUAL := REC_GDIRETA.CDGRSERVFAT;
      /*EQUIVALENCIA DE SERVICOS*/
      
      -- Se o servico utiliza equivalencia
      IF (REC_GDIRETA.CDSERVPREQUI IS NOT NULL) THEN
         -- Verifica se o servico de faturamento da equivalencia possui preco variavel no dia
         SELECT MAX(VRSERVFATUDT)
           INTO V_VRSERVFAEQ
           FROM SUM_EFETIVOS
          WHERE CDFILIAL = P_CDFILIAPUR
            AND CDCLIENTE = P_CDCLIENTE
            AND CDSERVFILI = REC_GDIRETA.CDSERVPREQUI
            AND ((IDFATUPLAN = 'F') OR (STIDUTEFEPLA = 'S'))
            AND (DTFATURAM = REC_GDIRETA.DTFATURAM);

         IF NVL(V_VRSERVFAEQ, 0) = 0 THEN
            V_VRSERVFAEQ := UTIL_APURAC.CALCVALRSERV(REC_GDIRETA.CDFILIAL, REC_GDIRETA.CDCLIENTE, REC_GDIRETA.CDSERVPREQUI, REC_GDIRETA.DTFATURAM, NULL);
         END IF;
         IF NVL(V_VRSERVFAEQ, 0) <> 0 THEN               
            V_VRSERVTOTAL := V_QTEFETSERV * V_VRSERVICO;
            V_QTEFETSERV  := ROUND(V_VRSERVTOTAL / V_VRSERVFAEQ,5);
            V_VRSERVICO   := V_VRSERVFAEQ;
            V_CDSERVFILI  := REC_GDIRETA.CDSERVPREQUI;
            -- Busca produto de faturamento do servico de equivalencia
            SELECT MAX(CDPRODUTO), MAX(NMSERVICO)
              INTO V_CDPRODUTOEQUI, V_NMSERVICOEQ
              FROM SERVICO
             WHERE CDFILIAL = P_CDFILIAPUR
               AND CDSERVFILI = REC_GDIRETA.CDSERVPREQUI;

            SELECT MAX(CDGRSERVFAT)
              INTO V_CDGRSERVFAT_ATUAL
              FROM SERVCLIE
             WHERE CDFILIAL = P_CDFILIAPUR
               AND CDCLIENTE = P_CDCLIENTE
               AND CDSERVFILI = V_CDSERVFILI;               

            V_CDPRODUTO := NVL(V_CDPRODUTOEQUI,V_CDPRODUTO);
            V_NMSERVICO := V_NMSERVICOEQ;
            V_DSPRODEMIS := UTIL_APURAC.DsNmServicoTur(REC_GDIRETA.CDFILIAL, REC_GDIRETA.CDCLIENTE, REC_GDIRETA.CDSERVPREQUI, REC_GDIRETA.DTFATURAM, NULL);
         END IF;
      END IF; 
      SELECT COUNT(*)
         INTO V_EXISTE
         FROM TRAB_APURAC_GD
        WHERE CDFILIALAPGD   = P_CDFILIPROC            AND
              NRAPURACGD     = P_NRAPURACFAT         AND
              CDCLIENTEAPGD  = REC_GDIRETA.CDCLIENTE AND
              CDSERVFILIAPGD = V_CDSERVFILI          AND
              NMSERVICOGD    = V_NMSERVICO           AND
              ROUND(VRPRECUNITAPGD, 5) = ROUND(V_VRSERVICO, 5) AND
              NVL(DSPRODEMISAPGD,' ') = NVL(V_DSPRODEMIS,' ') AND
              NVL(CDGRSERVFAT, ' ')    = NVL(V_CDGRSERVFAT_ATUAL, ' ');
      IF (V_EXISTE = 0) THEN
         INSERT INTO TRAB_APURAC_GD
            (CDFILIALAPGD, NRAPURACGD, CDCLIENTEAPGD,
             CDSERVFILIAPGD, DTAPURACFATGD, CDPRODUTOAPGD,
             NREFETIVOSAPGD, VRPRECUNITAPGD,
             IDAJUSEFETAPGD, IDPRODSUBSGD, IDUTILEQUIGD, NMSERVICOGD, DSPRODEMISAPGD, CDPTOVNDFATURTAP, CDGRSERVFAT, IDTABELA, NRAPURACENTRAL, CDFILIALCENTRAL, CDFILIAGREGADA)
         VALUES (P_CDFILIPROC, P_NRAPURACFAT, REC_GDIRETA.CDCLIENTE,
                 V_CDSERVFILI, P_DATAINI, V_CDPRODUTO,
                 V_QTEFETSERV, V_VRSERVICO,
                 'N', 'N', CASE WHEN REC_GDIRETA.CDSERVPREQUI IS NULL THEN 'N' ELSE 'S' END, V_NMSERVICO, V_DSPRODEMIS,  NULL, V_CDGRSERVFAT_ATUAL, 'GD', NULL, NULL, P_CDFILIAPUR);
      ELSE
         UPDATE TRAB_APURAC_GD
            SET NREFETIVOSAPGD = NREFETIVOSAPGD + V_QTEFETSERV,
                IDUTILEQUIGD   = CASE WHEN REC_GDIRETA.CDSERVPREQUI IS NULL THEN 'N' ELSE 'S' END
          WHERE CDFILIALAPGD   = P_CDFILIPROC            AND
                NRAPURACGD     = P_NRAPURACFAT         AND
                CDCLIENTEAPGD  = REC_GDIRETA.CDCLIENTE AND
                CDSERVFILIAPGD = V_CDSERVFILI          AND
                ROUND(VRPRECUNITAPGD, 5) = ROUND(V_VRSERVICO, 5) AND
                NMSERVICOGD = V_NMSERVICO AND
                NVL(DSPRODEMISAPGD,' ') = NVL(V_DSPRODEMIS,' ') AND
                NVL(CDGRSERVFAT, ' ') = NVL(V_CDGRSERVFAT_ATUAL, ' ');
      END IF;
   END LOOP;
   CLOSE CUR_GDIRETA;
   
   /* APAGA TODAS AS NOTAS FISCAIS APURADAS ANTERIORMENTE COM MESMO
   NUMERO DE APURACAO */
   FOR CURS_NF IN (SELECT CDFILIAL, NRLANCTONF
                   FROM NOTAFISCAL
                   WHERE (CDFILIAL    = P_CDFILIPROC) AND
                         (NRAPURACFAT = P_NRAPURACFAT)) LOOP
      DELETA_NF(CURS_NF.CDFILIAL, CURS_NF.NRLANCTONF);
   END LOOP;

   V_NRLANCTONF := P_NRLANCTONF;

   SELECT SUM(NVL(NREFETIVOSAPGD,0) * NVL(VRPRECUNITAPGD,0))
   INTO V_VRTOTASERV
   FROM TRAB_APURAC_GD
   WHERE CDFILIALAPGD   = P_CDFILIPROC  AND
         NRAPURACGD     = P_NRAPURACFAT;
         
   /*BUSCA DOS TIPOS DE OPERA??O SELECIONADOS PARA REFEI??O E PRESTA??O DE SERVI?OS,*/
   /*RESPECTIVAMENTE, CADASTRADOS NA TELA "PAR?METROS POR TIPO DE FATURAMENTO"*/
   SELECT 
      NVL(CDTPOPERREF, '01'),
      NVL(CDTPOPERPRESER, '01')
   INTO
      V_CDTPOPERREF,
      V_CDTPOPERPRESER
   FROM 
      PARAMGERAL; 

   IF V_VRTOTASERV > 0 THEN
     /*Geracao de Nota Fiscal de Refeicao*/

      V_VRLIQUFATU := (V_VRTOTASERV * ((100 - V_VRPERCSERV) / 100));

      V_CONTITEM  := V_TTITENSNF;

      IF V_VRLIQUFATU > 0 THEN
         FOR CURS_APURAC IN (SELECT CDFILIALAPGD, CDCLIENTEAPGD,
                                 CDSERVFILIAPGD, CDPRODUTOAPGD,
                                 NREFETIVOSAPGD, IDAJUSEFETAPGD, NMSERVICOGD AS NMSERVICO, DSPRODEMISAPGD AS DSPRODUTO, IDPRODSUBSGD,
                                 ROUND((VRPRECUNITAPGD * ((100 - V_VRPERCSERV) / 100)),2) AS VRPRECUNITAPGD
                             FROM TRAB_APURAC_GD
                             WHERE (TRAB_APURAC_GD.CDFILIALAPGD   = P_CDFILIPROC)       AND
                                   (TRAB_APURAC_GD.NRAPURACGD     = P_NRAPURACFAT)
                             ORDER BY CDFILIALAPGD, CDCLIENTEAPGD, IDPRODSUBSGD, CDSERVFILIAPGD) LOOP

           V_VRNFATACA  := NVL(V_VRNFATACA,0) + (CURS_APURAC.VRPRECUNITAPGD * CURS_APURAC.NREFETIVOSAPGD);

           IF (V_CONTITEM = V_TTITENSNF) THEN
               /* EFETUA O FECHAMENTO DA NOTA, GERACAO DE IMPOSTOS */

               V_CONTITEM   := 0;

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

               GERA_NOTAFISCAL_CORPO(P_CDFILIPROC,  P_CDFILIAPUR, V_CDEMPRATAC,
                                     V_CDTPOPERREF, V_SERIEATAC,  P_CDCLIENTE,
                                     P_DATAFIM,     'FAI',        V_NRLANCTONF,
                                     V_NRLANCESTQ,  'N',          P_NRAPURACFAT,
                                     V_NRLANCTONF,   NULL,        NULL,
                                     NULL,           NULL,        NULL,
                                     NULL,           NULL,        NULL,
                                     NULL,           NULL,        NULL,
                                     NULL,           NULL,        NULL,
                                     NULL,           P_DATAFIM);

            END IF;
            /*Inclusao dos itens da nota fiscal*/
            V_CONTITEM := V_CONTITEM + 1;

            GERA_NOTAFISCAL_PRODUTO(P_CDFILIPROC, V_NRLANCTONF, CURS_APURAC.CDPRODUTOAPGD,
                                    CURS_APURAC.CDSERVFILIAPGD, NVL(CURS_APURAC.DSPRODUTO, CURS_APURAC.NMSERVICO),
                                    CURS_APURAC.NREFETIVOSAPGD, CURS_APURAC.VRPRECUNITAPGD);

            IF (V_CONTITEM = V_TTITENSNF) THEN
               GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIPROC, V_NRLANCTONF);
            END IF;

         END LOOP;

         /*Efetua o fechamento da nota, geracao de impostos*/
         GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIPROC, V_NRLANCTONF);
      END IF;

      /*Geracao de Nota Fiscal de Servico*/

      NOVO_CODIGO('LANCNF/FILIAL' || P_CDFILIPROC, V_NRLANCTONF);
      V_NRLANCTONF := SUBSTR(V_NRLANCTONF,11,10);
      V_VRLIQUFATU := (V_VRTOTASERV - V_VRNFATACA);

      IF V_VRLIQUFATU > 0 THEN

         GERA_NOTAFISCAL_CORPO(P_CDFILIPROC,     P_CDFILIAPUR, V_CDEMPROPER,
                               V_CDTPOPERPRESER, V_SERIEOPER,  P_CDCLIENTE,
                               P_DATAFIM,        'FAI',        V_NRLANCTONF,
                               V_NRLANCESTQ,     'N',          P_NRAPURACFAT,
                               V_NRLANCTONF,     NULL,        NULL,
                               NULL,             NULL,        NULL,
                               NULL,             NULL,        NULL,
                               NULL,             NULL,        NULL,
                               NULL,             NULL,        NULL,
                               NULL,             P_DATAFIM);

         /*Inclusao dos itens da nota fiscal*/
         GERA_NOTAFISCAL_PRODUTO(P_CDFILIPROC, V_NRLANCTONF, V_CDPRGENEREF,
                                 V_CDPRGENEREF, V_NMPRGENEREF, 1, ROUND(V_VRLIQUFATU,2), 0,
                                 NULL, NULL, NULL, NULL,
                                 NULL, NULL);

         /*Efetua o fechamento da nota, geracao de impostos*/
         GERA_NOTAFISCAL_FECHAMENTO(P_CDFILIPROC, V_NRLANCTONF);
      END IF;

      DELETE FROM TRAB_APURAC_GD
      WHERE CDFILIALAPGD  = P_CDFILIPROC    AND
            NRAPURACGD    = P_NRAPURACFAT   AND
            CDCLIENTEAPGD = P_CDCLIENTE;
   END IF;
END;
/