create or replace PROCEDURE APURAC_GESDIRETA (
    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_CDSERVFILI  IN VARCHAR DEFAULT NULL,      
    P_GERAPREVIA  IN VARCHAR DEFAULT 'S', -- Se chamado pela RELGESDIRETA, pode assumir os valores R (sem equivalencia) ou RE (com equivalencia)
    P_CDFILIALCENTRAL IN FILIAL.CDFILIAL%TYPE DEFAULT NULL,
    P_NRAPURACENTRAL IN NOTAFISCAL.NRAPURACFAT%TYPE DEFAULT NULL) AS


 /* DECLARACAO DO TIPO (RECORD) QUE CONTERA OS DADOS DO CURSOR */  
 TYPE GDIRETARECTYPE IS RECORD (
    CDFILIAL       FILIAL.CDFILIAL%TYPE,
    CDCLIENTE      CLIENTE.CDCLIENTE%TYPE,
    CDTURNO        EFECLIFATTUR.CDTURNO%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);

 /* DECLARACAO DO TIPO DO CURSOR */
 TYPE GDIRETACURTYPE IS REF CURSOR RETURN GDIRETARECTYPE;

 /*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),
    DTAPURACFAT     DATE,
    IDAJUSEFET      VARCHAR2(1),
    IDPRODSUBS      VARCHAR2(1)
    
 );
 TYPE CURS_APURAC_CURTYPE IS REF CURSOR RETURN CURS_APURAC_RECTYPE;

 /* VARIAVEIS QUE CONTERAO O CURSOR E O REGISTRO */
 REC_GDIRETA     GDIRETARECTYPE;
 CUR_GDIRETA     GDIRETACURTYPE;
 REC_CURS_APURAC CURS_APURAC_RECTYPE;
 CURS_APURAC     CURS_APURAC_CURTYPE;

 /* VARIAVEIS PARA CONTROLE DE PARAMETROS */
 STIDTIPNFEMP       VARCHAR2(01);
 STIDMINIEFET       VARCHAR2(01);
 STIDQTDEPREC       VARCHAR2(01);
 STIDMINIEFET_CLI   VARCHAR2(01);
 STIDQTDEPREC_CLI   VARCHAR2(01);   
 STIDUTEFEPLA       VARCHAR2(01);

 /* VARIAVEIS PARA CONTROLE DE APURACAO */
 V_CDFILIAPUR   CTRLAPURFAT.CDFILIAPUR%TYPE;
 QTDEMINIEFET   EFECLIFAT.QTCOMEFATU%TYPE;
 VRMINIEFET     EFECLIFAT.QTCOMEFATU%TYPE;
 V_CDSERVAJUS   SERVICO.CDSERVFILI%TYPE;
 V_QTEFETSERV   NUMBER;
 V_QTEFETGRUP   NUMBER;
 V_TTEFETSERV   NUMBER;
 V_VRSERVICO    NUMBER;
 V_VRSERVICOGD  NUMBER;
 V_VRSERVICOTU  NUMBER;
 V_VRSERVFATU   NUMBER;
 V_VRPERCCORR   NUMBER;
 V_EXISTE       NUMBER;
 V_QTEFETPLA    NUMBER;
 V_QTEFETFAT    NUMBER;
 V_VRSERVFATUDT NUMBER;
 V_CDSERVPREQUI SERVICO.CDSERVPREQUI%TYPE;
 V_VRSERVFAEQ   SERVCLIE.VRSERVFATU%TYPE;
 V_VRSERVTOTAL  SERVCLIE.VRSERVFATU%TYPE;
 V_CDSERVFILI   SERVICO.CDSERVFILI%TYPE;
 V_NMSERVICO    SERVICO.NMSERVICO%TYPE;
 V_NMSERVICOEQ  SERVICO.NMSERVICO%TYPE;
 V_DSPRODEMIS   ITEMPRODUTO.DSPRODEMIS%TYPE;
 V_CDGRSERVFAT  VARCHAR2(03);

 /* VARIAVEIS PARA CONTROLE DE GRAVACAO DA NOTA FISCAL */
 V_CHAVECST     VARCHAR2(14);
 V_CSTTEMP      VARCHAR2(03);
 V_IDPRODSUBS   VARCHAR2(01);
 V_IDPRODANTE   VARCHAR2(01);
 V_CDPTOVNDFATURTAP VARCHAR2(30);

 V_CDSERIE_CLI    SERIENF.CDSERIE%TYPE;
 V_CDEMPRESA_CLI  CLIENTE.CDEMPRESA%TYPE;
 V_CDINSCMUNI_CLI CLIENTE.CDINSCMUNI%TYPE;
 V_CDINSCESTA_CLI CLIENTE.CDINSCESTA%TYPE;

 V_CDSERIE_ANTEC    SERIENF.CDSERIE%TYPE;
 V_CDEMPRESA_ANTEC  CLIENTE.CDEMPRESA%TYPE;
 V_CDINSCMUNI_ANTEC CLIENTE.CDINSCMUNI%TYPE;
 V_CDINSCESTA_ANTEC CLIENTE.CDINSCESTA%TYPE;

 V_CDSERIE      SERIENF.CDSERIE%TYPE;
 V_CDSERIEVANTECIPA SERIENF.CDSERIE%TYPE;
 V_CDSERIEAUTO  SERIENF.CDSERIE%TYPE;
 V_IDSERIEAUTO  VARCHAR2(01);
 V_TTITENSNF    NUMBER;
 V_CONTITEM     NUMBER;
 V_NRLANCTONF   VARCHAR2(20);
 V_NRSEQITPROD  NUMBER;
 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_NRINSJURTRAN CLIENTE.NRINSJURTRAN%TYPE;
 V_IDTPIJURTRAN CLIENTE.IDTPIJURTRAN%TYPE;
 V_IDPGTOFRETE  CLIENTE.IDPGFRETTRANCLI%TYPE;
 V_NRPLACAVEIC  VIATURA.NRPLACA%TYPE;
 V_SGUFVEICULO  VIATURA.SGUFVEICULO%TYPE;
 V_IDNOVANOTA   VARCHAR2(01);
 V_VRNOTAFISC   NUMBER;
 V_PRXLANCESTQ  VARCHAR2(10);
 V_VRCREDIDEBI  NOTAFISCAL.VRNOTAFISC%TYPE;

 V_DSAJUCTREC      AJCTRECEBER.DSAJUSTEREC%TYPE;
 V_ENCARGO         ENCARGO.CDENCARGO%TYPE;
 V_IDCOPALTEFEPLA  PARAMFILIAL.IDCOPALTEFEPLA%TYPE;
 V_CDPRODPRESTSERV VARCHAR2(10);

 V_CDGRUPOFISC  VARCHAR2(03);
 V_DESCDOTACAO  VARCHAR2(01);
 V_CDAJUSTPADR  VARCHAR2(02);
 V_CDENCREDITO  VARCHAR2(02);
 V_CDENCDEBITO  VARCHAR2(02);
 V_IDUTPROPEMIS VARCHAR2(01);
 V_CDARVPROD    PRODUTO.CDARVPROD%TYPE;
 V_NMPRODUTO    PRODUTO.NMPRODUTO%TYPE;
 V_CDSERVFILIAP SERVICO.CDSERVFILI%TYPE;
 V_MINEFETFAT   VARCHAR2(01);
 V_IDUTILEQUI   VARCHAR2(01);
 V_NREFETAUX    NUMBER;
 V_NREFETAUXGD  NUMBER;
 V_NREFETAUXTU  NUMBER;
 V_VRUNITARIO   NUMBER;
 V_CDTIPOFATUR  PARAMFILIAL.CDTIPOFATUR%TYPE;
 V_IDENDCFOP      VARCHAR2(01);
 V_PAISORIG       VARCHAR2(04);
 V_ESTAORIG       VARCHAR2(02);
 V_MUNIORIG       VARCHAR2(04);
 V_ORIGDESTOP     VARCHAR2(01);
 V_CDORIGDESTNF   VARCHAR2(21);
 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);

 /* VARIAVEL DO TIPO DE OPERACAO */
 V_CDTIPOOPER   VARCHAR2(02);
 V_IDATIVATABCOR VARCHAR2(1);
 V_IDCOREFECLIFILI VARCHAR2(1);
 V_VRAPURFATTABCOR NUMBER;
 V_VRAPURACAOFATU NUMBER;
 V_VRSERVICOCORRI NUMBER;

 V_CDSERVFILIAPGD VARCHAR2(05);
 V_IDUTILADIANT  VARCHAR2(1);
 V_IDCLIENPRIN VARCHAR2(1);
 V_COMPENSACAO VARCHAR2(1); /*VERIFICA SE A APURACAO FOI CHAMADA PELO CONTROLE DE COMPESACAO*/
 V_QTPRODFATU NUMBER; /*Variavel retorna se o produto sera 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*/
 V_DSEMISSAO VARCHAR2(2000);
 V_NRGRUPONF NUMBER;
 V_NREFETIVOS_SERV FLOAT(126);
 V_VRSERVICO_SERV FLOAT(126);
 V_CDCLIENTE VARCHAR2(21);
 V_SEQUENCIAL NUMBER;

 V_CDPRODUTO VARCHAR2(10);
 V_CDPRODUTOEQUI VARCHAR2(10);

 V_CDSERVORI VARCHAR2(5);
 V_CDGRSERVFAT_ATUAL VARCHAR2(03);

 V_IDPRESENCIALFAIGD VARCHAR2(1);

 V_IDBLOQEFEPDIFEFEF VARCHAR2(1);
 V_QTCLIEFETCAR FLOAT;
 V_QTCOMEFETCLI FLOAT;
 V_DSSERVICO VARCHAR2(400);

 /* 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.CDTURNO,  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.CDTURNO,  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 = V_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.CDTURNO, SM.DTFATURAM;
 END OPENGDIRETACURSOR;

 /*PROCEDIMENTO QUE ABRE O CURSOR PARA OS ITENS DAS NFS*/
 PROCEDURE OPENCURSAPURAC (CURS_APURAC IN OUT CURS_APURAC_CURTYPE) IS
 BEGIN
    IF (V_IDUTILADIANT = 'S') THEN
      /*SE UTILIZA CONTROLE DE VENDA ANTECIPADA, RETORNA TODOS OS ITENS PARA GERA??O DE NF*/
       OPEN CURS_APURAC FOR
          SELECT P_NRAPURACFAT AS NRAPURACFAT, CT.CDFILIAL, CT.CDCLIENTE, CT.CDSERVFILI, NULL AS CDTURNO,
                 UTIL_APURAC.CalcValrServ(CT.CDFILIAL, CT.CDCLIENTE, CT.CDSERVFILI, CT.DTVENDA, NULL) AS VRPRECOUNIT, SE.CDPRODUTO,
                 NULL AS DSPRODUTO, P.CDARVPROD, P.NMPRODUTO, CT.QTREFEICAO NREFETIVOS,
                 SE.NMSERVICO,
                 ' ' AS CDGRSERVFAT, V_CDTIPOOPER AS CDTIPOOPER, 0 AS VRDESCONTO, NULL AS DSJUSTIFICATIVA, 0 AS NRGRUPONF, NULL AS NRPEDIDO,
                 NULL AS NRITEMPED, 'CT' AS IDTABELA, 'N' AS UTILSERVEQUI, NULL AS DTAPURACFAT, NULL AS IDAJUSEFET, NULL AS IDPRODSUBS
            FROM CTRLVENDAANTEC CT, SERVICO SE, PRODUTO P
           WHERE (TRUNC(CT.DTVENDA) BETWEEN P_DATAINI AND P_DATAFIM) AND
                 (INSTR(P_CDSERVFILI, CT.CDSERVFILI) > 0) AND
                 CT.CDFILIAL   = V_CDFILIAPUR AND
                 CT.CDCLIENTE  = P_CDCLIENTE  AND
                 CT.CDFILIAL   = SE.CDFILIAL  AND 
                 CT.CDSERVFILI = SE.CDSERVFILI AND
                 P.CDPRODUTO   = SE.CDPRODUTO;

    ELSIF (V_COMPENSACAO = 'S') THEN
       /*SE UTILIZA COMPENSACAO E GERA NF SEPARADA, RETORNA TODOS OS ITENS DE COMPENSACAO MANUAL PARA GERA??O DE NF*/
       OPEN CURS_APURAC FOR
          SELECT CP.NRAPURACCOMP AS NRAPURACFAT, CP.CDFILIAL, CP.CDCLIENTE, CP.CDSERVFILI, NULL AS CDTURNO, CP.VRSERVICO AS VRPRECOUNIT, SE.CDPRODUTO,
                 PC.DSEFETMINPERIOD AS DSPRODUTO, P.CDARVPROD, P.NMPRODUTO, CP.QTEFETDIF NREFETIVOS, SE.NMSERVICO, NULL CDGRSERVFAT,
                 V_CDTIPOOPER AS CDTIPOOPER, 0 AS VRDESCONTO, NULL AS DSJUSTIFICATIVA, 0 AS NRGRUPONF, NULL AS NRPEDIDO, NULL AS NRITEMPED, 
                 'CP' AS IDTABELA, 'N' AS UTILSERVEQUI, NULL AS DTAPURACFAT, NULL AS IDAJUSEFET, NULL AS IDPRODSUBS 
            FROM CTRLCOMPENSACAO CP, SERVICO SE, PARAMCOMPENSACAO PC, PRODUTO P
           WHERE (TRUNC(CP.DTBASE) BETWEEN P_DATAINI AND P_DATAFIM) AND
                 (INSTR(P_CDSERVFILI, CP.CDSERVFILI) > 0) AND
                 CP.CDFILIAL          = P_CDFILIAL    AND
                 CP.CDFILIAPUR        = V_CDFILIAPUR  AND
                 CP.CDCLIENTE         = P_CDCLIENTE   AND
                 CP.CDFILIAPUR        = SE.CDFILIAL    AND 
                 CP.CDSERVFILI        = SE.CDSERVFILI  AND
                 CP.NRAPURACCOMP      = P_NRAPURACFAT AND
                 CP.NRPARAMCOMPENSACAO = PC.NRPARAMCOMPENSACAO(+) AND
                 P.CDPRODUTO          = SE.CDPRODUTO;
    ELSE
       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, A.NREFETIVOS, A.NMSERVICO, 
                 NVL(A.CDGRSERVFAT, ' ') AS CDGRSERVFAT, A.CDTIPOOPER, A.VRDESCONTO, A.DSJUSTIFICATIVA, A.NRGRUPONF, A.NRPEDIDO, A.NRITEMPED, A.IDTABELA, A.UTILSERVEQUI, DTAPURACFAT, IDAJUSEFET, IDPRODSUBS
            FROM(SELECT NRAPURACGD AS NRAPURAC, CDFILIALAPGD 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, DTAPURACFATGD AS DTAPURACFAT, IDAJUSEFETAPGD AS IDAJUSEFET, IDPRODSUBSGD AS IDPRODSUBS
                   FROM TRAB_APURAC_GD 
                  WHERE CDFILIALAPGD = P_CDFILIAL AND NRAPURACGD = P_NRAPURACFAT AND CDCLIENTEAPGD = P_CDCLIENTE
                 UNION ALL 
                 SELECT NRAPURACTU AS NRAPURAC, CDFILIALAPTU 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, DTAPURACFATTU AS DTAPURACFAT, IDAJUSEFETAPTU AS IDAJUSEFET, IDPRODSUBSTU AS IDPRODSUBS
                   FROM TRAB_APURAC_TU 
                  WHERE CDFILIALAPTU = P_CDFILIAL AND NRAPURACTU = P_NRAPURACFAT AND CDCLIENTEAPTU = P_CDCLIENTE
                ) A INNER JOIN PRODUTO P ON P.CDPRODUTO = A.CDPRODUTO
          ORDER BY A.CDCLIENTE, A.NRGRUPONF, A.CDSERVFILI;
    END IF;
 END OPENCURSAPURAC;

 PROCEDURE INSERE_HISTORICO(P_H_DTAPURACAO DATE, P_H_CDFILIAPUR VARCHAR2, P_H_CDSERVFILI VARCHAR2, P_H_CDTURNO VARCHAR2,
                            P_H_NMSERVICO VARCHAR2, P_H_DSPRODEMIS VARCHAR2, P_H_CDPRODUTO VARCHAR2, P_H_CDSERVORI VARCHAR2,
                            P_H_IDUTILEQUI VARCHAR2, P_H_IDAJUSEFET VARCHAR2, P_H_IDPRODSUBS VARCHAR2,
                            P_H_NREFETIVOS NUMBER, P_H_VRPRECUNIT VARCHAR2, P_H_CDGRSERVFAT VARCHAR2, P_H_NRGRUPONF NUMBER, P_H_CDTIPOOPER VARCHAR2)
 AS
    V_SEQ VARCHAR2(20);
    V_NRHISTCTRLAPURFAT NUMBER;

 BEGIN
    IF NVL(P_IDGERANOTA, 'S') = 'S' THEN

       NOVO_CODIGO_NT('HISTCTRLAPURFAT', V_SEQ, 1);
       V_NRHISTCTRLAPURFAT := TO_NUMBER(V_SEQ);

       INSERT INTO HISTCTRLAPURFAT
       (NRHISTCTRLAPURFAT, CDFILIAL, CDFILIAPUR, NRAPURACFAT, CDCLIENTE,
       DTAPURACAO, CDSERVFILI, CDTURNO, 
       NMSERVICO, DSPRODEMIS, CDSERVORI, CDPRODUTO,
       IDUTILEQUI, IDAJUSEFET, IDPRODSUBS, 
       NREFETIVOS, VRPRECUNIT, CDGRSERVFAT,NRGRUPONF, CDTIPOOPER, 
       CDFILIAGREGADA, NRAPURACENTRAL, CDFILIALCENTRAL,
       DTINCLUSAO, DTULTATU)
       VALUES
       (V_NRHISTCTRLAPURFAT, P_CDFILIAL, P_H_CDFILIAPUR, P_NRAPURACFAT, P_CDCLIENTE,
       P_H_DTAPURACAO, P_H_CDSERVFILI, P_H_CDTURNO, 
       P_H_NMSERVICO,  P_H_DSPRODEMIS, P_H_CDSERVORI, P_H_CDPRODUTO,
       P_H_IDUTILEQUI, P_H_IDAJUSEFET, P_H_IDPRODSUBS, 
       P_H_NREFETIVOS, P_H_VRPRECUNIT, P_H_CDGRSERVFAT, P_H_NRGRUPONF, P_H_CDTIPOOPER,
       P_H_CDFILIAPUR, P_NRAPURACENTRAL, P_CDFILIALCENTRAL,
       SYSDATE, SYSDATE);

    END IF;
 END;

BEGIN
 /*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;

 V_VRCREDIDEBI := 0;

 V_CHAVECST := P_CDFILIAL || P_NRAPURACFAT;

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

 IF P_GERAPREVIA IN ('R', 'RE') THEN
    V_CDFILIAPUR := P_CDFILIAL;
 END IF;         

 SELECT NVL(MAX(IDUTILADIANT),'N')  /*VERIFICA SE UTILIZA ADIANTAMENTO PARA ROTINA DE VENDA ANTECIPADA*/
   INTO V_IDUTILADIANT
   FROM CLIENFILIAL 
  WHERE CDFILIAL = V_CDFILIAPUR
    AND CDCLIENTE = P_CDCLIENTE;

 IF (V_IDUTILADIANT = 'N') AND (P_CDSERVFILI IS NOT NULL) THEN
    V_COMPENSACAO := 'S';
 ELSE
    V_COMPENSACAO := 'N';

    /*RETORNA A SERIE E OS DADOS DA EMPRESA ESCOLHIDA PARA GERACAO DA NOTA FISCAL NA VENDA ANTECIPADA*/
    SELECT MAX(CDEMPRESA) AS CDEMPRESA, MAX(CDINSCESTA) AS CDINSCESTA, MAX(CDINSCMUNI) AS CDINSCMUNI, MAX(CDSERIE) AS CDSERIE
      INTO V_CDEMPRESA_ANTEC, V_CDINSCESTA_ANTEC, V_CDINSCMUNI_ANTEC, V_CDSERIE_ANTEC
      FROM CTRLVENDAANTEC CT
     WHERE (TRUNC(CT.DTVENDA) BETWEEN P_DATAINI AND P_DATAFIM) AND
           (INSTR(P_CDSERVFILI, CT.CDSERVFILI) > 0) AND
           CT.CDFILIAL   = V_CDFILIAPUR AND
           CT.CDCLIENTE  = P_CDCLIENTE;    
 END IF;

 /* BUSCA AS INFORMACOES DO CLIENTE PARA CADASTRAMENTO DA NOTA FISCAL */
 SELECT MAX(CDEMPRESA), MAX(CDINSCMUNI), MAX(CDINSCESTA), MAX(CDSERIE)
 INTO V_CDEMPRESA_CLI, V_CDINSCMUNI_CLI, V_CDINSCESTA_CLI, V_CDSERIE_CLI
 FROM CLIENTE
 WHERE CDCLIENTE = P_CDCLIENTE;

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

 /* SE EXISTE PARAMETRIZACAO PARA O CLIENTE ENTAO SOBREPOE A PARAMETRIZACAO DA FILIAL */
 IF(V_CDEMPRESA_CLI IS NOT NULL) THEN
    V_CDEMPRESA := V_CDEMPRESA_CLI;
 END IF;   
 IF(V_CDINSCMUNI_CLI IS NOT NULL) THEN
    V_CDINSCMUNI := V_CDINSCMUNI_CLI;
 END IF;
 IF(V_CDINSCESTA_CLI IS NOT NULL) THEN
    V_CDINSCESTA := V_CDINSCESTA_CLI;
 END IF;   
 IF(V_CDSERIE_CLI IS NOT NULL) THEN
    V_CDSERIE := V_CDSERIE_CLI;        
 END IF;

 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_CDSERIEAUTO
      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;

 IF V_CDSERIEAUTO IS NULL THEN
    /*BUSCA A SERIE DE VENDA ANTECIPADA CASO O CLIENTE UTILIZE ADIANTAMENTO*/
    IF V_IDUTILADIANT = 'S' THEN
       IF V_CDSERIEVANTECIPA IS NOT NULL THEN
          V_CDSERIE := V_CDSERIEVANTECIPA;
       END IF;
    END IF;
 ELSE
   V_CDSERIE := V_CDSERIEAUTO;
 END IF;

 /*SE A APURACAO VEIO DA VENDA ANTECIPADA E O USUARIO INFORMOU UMA SERIE ESPECIFICA PARA ELA, ENTAO SUBSTITUI AS INFORMACOES DA SERIE*/
 IF V_IDUTILADIANT = 'S' AND V_CDSERIE_ANTEC IS NOT NULL THEN
     IF(V_CDEMPRESA_ANTEC IS NOT NULL) THEN
        V_CDEMPRESA := V_CDEMPRESA_ANTEC;
     END IF;   
     IF(V_CDINSCMUNI_ANTEC IS NOT NULL) THEN
        V_CDINSCMUNI := V_CDINSCMUNI_ANTEC;
     END IF;
     IF(V_CDINSCESTA_ANTEC IS NOT NULL) THEN
        V_CDINSCESTA := V_CDINSCESTA_ANTEC;
     END IF;   
     IF(V_CDSERIE_ANTEC IS NOT NULL) THEN
        V_CDSERIE := V_CDSERIE_ANTEC;        
     END IF;
 END IF;

 SELECT NVL(MAX(NRMAXITNF),10)
 INTO V_TTITENSNF
 FROM SERIENF
 WHERE CDEMPRESA  = V_CDEMPRESA  AND
       CDINSCESTA = V_CDINSCESTA AND
       CDINSCMUNI = V_CDINSCMUNI AND
       CDSERIE    = V_CDSERIE;

 /*DADOS DO EMITENTE*/
 SELECT NVL(MAX(IDENDCFOPFIL),'I'), MAX(CDEMPRESA), MAX(CDINSCESTA)
 INTO   V_IDENDCFOP,                V_CDEMPRESA,    V_CDINSCESTA
 FROM   FILIAL
 WHERE  (CDFILIAL = V_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     = V_CDFILIAPUR) AND
           (IDTPENDEFILI = V_IDENDCFOP);
 END IF;

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

 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;

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

 IF P_GERAPREVIA IS NULL OR P_GERAPREVIA = 'S' THEN
    /*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 CDFILIALAPGD  = P_CDFILIAL    AND
          NRAPURACGD    = P_NRAPURACFAT;

    /* APAGA OS REGISTROS DA TRAB_APURAC_TU DE APURACOES ANTERIORES */
    DELETE FROM TRAB_APURAC_TU
    WHERE CDFILIALAPTU  = P_CDFILIAL    AND
          NRAPURACTU    = P_NRAPURACFAT;

    /* APAGA OS REGISTROS DE HISTORICO DE APURACOES ANTERIORES */
    DELETE FROM HISTCTRLAPURFAT
    WHERE CDFILIAL = P_CDFILIAL AND
          NRAPURACFAT = P_NRAPURACFAT;
 END IF;
 /* 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;

 SELECT MAX(SUBSTR(DSPARAMFATFI,01,1)),
        MAX(SUBSTR(DSPARAMFATFI,02,1)),
        MAX(SUBSTR(DSPARAMFATFI,15,1)),
        MAX(SUBSTR(DSPARAMFATFI,56,1)),          /*DESCONTO DE DOTACAO*/
        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),
        MAX(IDPRESENCIALFAIGD)
 INTO STIDMINIEFET,  STIDQTDEPREC,  STIDUTEFEPLA,
      V_DESCDOTACAO, V_CDAJUSTPADR, V_CDENCREDITO,
      V_CDENCDEBITO, V_CDTIPOFATUR, V_IDCOPALTEFEPLA,
      V_IDPRESENCIALFAIGD
 FROM PARAMFILIAL
 WHERE CDFILIAL = V_CDFILIAPUR;

 /*BUSCA PARAMETRO CORRIGIR EFETIVOS (QUANTIDADE OU PRECO UNITARIO) E CONSIDERAR MINIMO DE EFETIVOS (POR DIA OU PERIODO)* DO CADASTRO DE CLIENTE POR FILIAL*/ 
 SELECT IDCOREFECLIFILI, IDCONSMINEFECLI
   INTO STIDQTDEPREC_CLI, STIDMINIEFET_CLI
   FROM CLIENFILIAL 
  WHERE CDFILIAL = V_CDFILIAPUR
    AND CDCLIENTE = P_CDCLIENTE;

  /*CORRIGIR EFETIVOS - SE O CLIENTE ESTIVER PARAMETRIZADO (OU SEJA, <> 'I') ENTAO CONSIDERA O PARAMETRO DO CLIENTE 1 POR QUANTIDADE 2 POR PRECO UNITARIO
      SE O CLIENTE NAO ESTIVER PARAMETRIZADO CONSIDERA O PARAMETRO DA FILIAL*/
  IF (STIDQTDEPREC_CLI <> 'I') THEN
     STIDQTDEPREC := CASE WHEN STIDQTDEPREC_CLI = 'Q' THEN '1' ELSE '2' END;  
  END IF;
  /*CONSIDERA MININMO DE EFETIVOS - SE O CLIENTE ESTIVER PARAMETRIZADO (OU SEJA <> 'I') ENTAO CONSIDERA O PARAMETRO DO CLIENTE 1 POR DIA 2 POR PERIODO
      SE O CLIENTE NAO ESTIVER PARAMETRIZADO CONSIDERA O PARAMETRO DA FILIAL*/
  IF(STIDMINIEFET_CLI <> 'I')THEN
      STIDMINIEFET := CASE WHEN STIDMINIEFET_CLI = 'D' THEN '1' ELSE '2' END;  
  END IF;

 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';
       -- REFEICAO
    END IF;
 END IF;

 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;

 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);
 /*SE FILIAL UTILIZA ADIANTAMENTO OU ESTA GERANDO NF SEPARADA PARA COMPENSACAO, ENT?O N?O CALCULA APURACAO E NEM PREVIA, VAI SOMENTE GERAR NF*/
 IF (P_GERAPREVIA IS NULL OR P_GERAPREVIA <> 'N') AND (V_IDUTILADIANT = 'N' OR P_GERAPREVIA = 'R' OR P_GERAPREVIA = 'RE') AND (V_COMPENSACAO = 'N') THEN 

    IF ((P_GERAPREVIA <> 'R' AND P_GERAPREVIA <> 'RE') OR P_GERAPREVIA IS NULL) THEN
        /* CONSISTENCIA DOS EFETIVOS DO FATURAMENTO x EFETIVOS DO PLANEJAMENTO*/
        FOR C_PLA_X_FAT IN (SELECT SM.CDSERVFILI, DTFATURAM, SUM(QTEFETIVOS) AS QTEFETIVOS
                              FROM SUM_EFETIVOS SM INNER JOIN SERVICO S ON S.CDFILIAL = SM.CDFILIAL AND S.CDSERVFILI = SM.CDSERVFILI AND S.IDCONSCOMFAT = 'S'
                             WHERE (SM.CDFILIAL = P_CDFILIAL) AND 
                                   (SM.CDCLIENTE = P_CDCLIENTE) AND
                                   (SM.IDFATUPLAN = 'F') AND
                                   (SM.DTFATURAM BETWEEN P_DATAINI AND P_DATAFIM)
                            GROUP BY SM.CDSERVFILI, DTFATURAM
                            ORDER BY SM.CDSERVFILI, SM.DTFATURAM
        )LOOP   
           SELECT SUM(NVL(QTEFETIVOS,0))
           INTO V_QTEFETPLA
           FROM SUM_EFETIVOS
           WHERE DTFATURAM  = C_PLA_X_FAT.DTFATURAM AND
                 IDFATUPLAN = 'P'                   AND
                 CDFILIAL   = P_CDFILIAL  AND
                 CDCLIENTE  = P_CDCLIENTE AND
                 CDSERVFILI = C_PLA_X_FAT.CDSERVFILI;

           IF V_QTEFETPLA <> 0 THEN
              IF V_QTEFETPLA <> C_PLA_X_FAT.QTEFETIVOS THEN
                 RAISE_APPLICATION_ERROR(-20504, 'ERRO_INCONSEFETIVOS\ Data:'||C_PLA_X_FAT.DTFATURAM, True);
              END IF;
           END IF;
        END LOOP;


        SELECT MAX(IDBLOQEFEPDIFEFEF)
          INTO V_IDBLOQEFEPDIFEFEF
          FROM PARAMFILIAL
         WHERE CDFILIAL = V_CDFILIAPUR;

        V_IDBLOQEFEPDIFEFEF := NVL(V_IDBLOQEFEPDIFEFEF, 'N');

        IF V_IDBLOQEFEPDIFEFEF = 'S' THEN
            /* CONSISTENCIA DOS EFETIVOS DO FATURAMENTO x EFETIVOS DO PLANEJAMENTO*/
            FOR C_EFET IN (SELECT SM.CDSERVPLAN, SM.DTFATURAM
                             FROM SUM_EFETIVOS SM
                            WHERE (SM.CDFILIAL = V_CDFILIAPUR) AND 
                                  (SM.CDCLIENTE = P_CDCLIENTE) AND
                                  (SM.IDFATUPLAN = 'P') AND
                                  (SM.DTFATURAM BETWEEN P_DATAINI AND P_DATAFIM)
                            GROUP BY SM.CDSERVPLAN, DTFATURAM
            )LOOP
                SELECT SUM(C.QTCLIEFETCAR)
                  INTO V_QTCLIEFETCAR
                  FROM CARDADIA C
                 WHERE CDFILIAL = V_CDFILIAPUR
                   AND CDSERVFILI = C_EFET.CDSERVPLAN
                   AND DTCARDAPIO = C_EFET.DTFATURAM;

                V_QTCLIEFETCAR := NVL(V_QTCLIEFETCAR, 0.00);

                SELECT SUM(QTCOMEFETCLI + NVL(QTVENDAEFETCLI,0))
                  INTO V_QTCOMEFETCLI
                  FROM EFETCLIE E 
                 WHERE CDFILIAL = V_CDFILIAPUR
                   AND DTEFETCLIE = C_EFET.DTFATURAM
                   AND CDSERVPLAN = C_EFET.CDSERVPLAN;

                V_QTCOMEFETCLI := NVL(V_QTCOMEFETCLI, 0.00);

                IF (V_QTCOMEFETCLI <> V_QTCLIEFETCAR) THEN
                    SELECT MAX(CDSERVFILI || ' - ' || NMSERVICO)
                      INTO V_DSSERVICO
                      FROM SERVICO
                     WHERE CDFILIAL = V_CDFILIAPUR
                       AND CDSERVFILI = C_EFET.CDSERVPLAN;

                    RAISE_APPLICATION_ERROR(-20000, 'EFETFAT_DIF_EFETPLA'|| '#$#' || V_DSSERVICO || '#_#' || TO_CHAR(C_EFET.DTFATURAM, 'YYYYMMDD') || '#*#');
                END IF;
            END LOOP;
        END IF;
    END IF;

    /*INICIO DA ROTINA DE PREPARACAO DOS ITENS PARA AS NOTAS FISCAIS*/
    OPENGDIRETACURSOR(CUR_GDIRETA, STIDUTEFEPLA);
    LOOP
       FETCH CUR_GDIRETA INTO REC_GDIRETA;
       EXIT WHEN CUR_GDIRETA%NOTFOUND;
       /*Conforme solicita??o 174067, caso o servi?o tenha valor vari?vel, o valor dever? 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 SEM TURNO */
       IF REC_GDIRETA.CDTURNO IS NULL THEN
          -- CORRIGE POR DIA
          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 S? GRAVA UMA VEZ)*/
             SELECT COUNT(*)
               INTO V_EXISTE
               FROM TRAB_APURAC_GD
              WHERE CDFILIALAPGD   = P_CDFILIAL 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_CDFILIAL, P_NRAPURACFAT, REC_GDIRETA.CDCLIENTE,
                              REC_GDIRETA.CDSERVFILI, REC_GDIRETA.DTFATURAM, 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', P_NRAPURACENTRAL, P_CDFILIALCENTRAL, V_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_CDFILIAL, P_NRAPURACFAT, REC_GDIRETA.CDCLIENTE,
                              REC_GDIRETA.CDSERVFILI, REC_GDIRETA.DTFATURAM, 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', P_NRAPURACENTRAL, P_CDFILIALCENTRAL, V_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;
       END IF;
       V_CDPRODUTO := REC_GDIRETA.CDPRODUTO;
       V_CDGRSERVFAT_ATUAL := REC_GDIRETA.CDGRSERVFAT;
       /*EQUIVALENCIA DE SERVICOS*/
       -- Se o servico utiliza equivalencia e, caso chamado pela RELGESDIRETA nao tenha solicitado visualizar a equivalencia
       V_CDSERVORI := NULL;
       IF (REC_GDIRETA.CDSERVPREQUI IS NOT NULL) AND (NVL(P_GERAPREVIA, 'S') <> 'R') THEN
          -- Indica servico antes da equivalencia
          V_CDSERVORI := V_CDSERVFILI;
          -- Verifica se o servico de faturamento da equivalencia possui preco variavel no dia
          SELECT MAX(VRSERVFATUDT)
            INTO V_VRSERVFAEQ
            FROM SUM_EFETIVOS
           WHERE CDFILIAL = V_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
            IF REC_GDIRETA.CDTURNO IS NULL THEN
               V_VRSERVFAEQ := UTIL_APURAC.CALCVALRSERV(REC_GDIRETA.CDFILIAL, REC_GDIRETA.CDCLIENTE, REC_GDIRETA.CDSERVPREQUI, REC_GDIRETA.DTFATURAM, NULL);
            ELSE
               V_VRSERVFAEQ := UTIL_APURAC.CALCVALRSERVTUR(REC_GDIRETA.CDFILIAL, REC_GDIRETA.CDCLIENTE, REC_GDIRETA.CDSERVPREQUI, REC_GDIRETA.DTFATURAM, REC_GDIRETA.CDTURNO);
            END IF;
          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 = V_CDFILIAPUR
                AND CDSERVFILI = REC_GDIRETA.CDSERVPREQUI;

             SELECT MAX(CDGRSERVFAT)
               INTO V_CDGRSERVFAT_ATUAL
               FROM SERVCLIE
              WHERE CDFILIAL = V_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, REC_GDIRETA.CDTURNO);
          END IF;
       END IF;   
       /*GRAVAR EFETVIOS AJUSTADOS POR TURNO*/
       IF REC_GDIRETA.CDTURNO IS NOT NULL THEN
          /* GRAVA OS SERVICOS NA TRAB_APURAC_TU*/
          SELECT COUNT(*)
            INTO V_EXISTE
            FROM TRAB_APURAC_TU
           WHERE CDFILIALAPTU   = P_CDFILIAL             AND
                 NRAPURACTU     = P_NRAPURACFAT          AND
                 CDCLIENTEAPTU  = REC_GDIRETA.CDCLIENTE  AND
                 CDSERVFILIAPTU = V_CDSERVFILI           AND
                 CDTURNOTU      = REC_GDIRETA.CDTURNO    AND
                 NMSERVICOTU    = V_NMSERVICO AND
                 (DTAPURACFATTU = REC_GDIRETA.DTFATURAM OR (NVL(P_GERAPREVIA, 'S') NOT IN ('R', 'RE')) ) AND
                 ROUND(VRPRECUNITAPTU, 5) = ROUND(V_VRSERVICO, 5) AND
                 NVL(CDGRSERVFAT, ' ')    = NVL(V_CDGRSERVFAT_ATUAL, ' ');
          IF (V_EXISTE = 0) THEN
             INSERT INTO TRAB_APURAC_TU
                (CDFILIALAPTU,   NRAPURACTU, CDCLIENTEAPTU,
                 CDSERVFILIAPTU, DTAPURACFATTU, CDPRODUTOAPTU,
                 NREFETIVOSAPTU, VRPRECUNITAPTU,
                 IDAJUSEFETAPTU, IDPRODSUBSTU, CDTURNOTU, IDUTILEQUITU, NMSERVICOTU, DSPRODEMISAPTU, CDGRSERVFAT, IDTABELA, NRAPURACENTRAL, CDFILIALCENTRAL, CDFILIAGREGADA)
             VALUES (P_CDFILIAL, P_NRAPURACFAT, REC_GDIRETA.CDCLIENTE,
                     V_CDSERVFILI, REC_GDIRETA.DTFATURAM, V_CDPRODUTO,
                     V_QTEFETSERV, V_VRSERVICO,
                     'N', 'N', REC_GDIRETA.CDTURNO, CASE WHEN REC_GDIRETA.CDSERVPREQUI IS NULL THEN 'N' ELSE 'S' END, V_NMSERVICO, V_DSPRODEMIS, V_CDGRSERVFAT_ATUAL, 'TU', P_NRAPURACENTRAL, P_CDFILIALCENTRAL, V_CDFILIAPUR);               
          ELSE
             UPDATE TRAB_APURAC_TU
             SET NREFETIVOSAPTU = NREFETIVOSAPTU + V_QTEFETSERV,
                 IDUTILEQUITU   = CASE WHEN REC_GDIRETA.CDSERVPREQUI IS NULL THEN 'N' ELSE 'S' END
             WHERE CDFILIALAPTU   = P_CDFILIAL                    AND
                   NRAPURACTU     = P_NRAPURACFAT                 AND
                   CDCLIENTEAPTU  = REC_GDIRETA.CDCLIENTE         AND
                   CDSERVFILIAPTU = V_CDSERVFILI                  AND
                   (DTAPURACFATTU = REC_GDIRETA.DTFATURAM OR (NVL(P_GERAPREVIA, 'S') NOT IN ('R', 'RE'))) AND
                   ROUND(VRPRECUNITAPTU, 5) = ROUND(V_VRSERVICO, 5) AND
                   CDTURNOTU      = REC_GDIRETA.CDTURNO           AND
                   NMSERVICOTU    = V_NMSERVICO                   AND
                   NVL(CDGRSERVFAT, ' ') = NVL(V_CDGRSERVFAT_ATUAL, ' ');
          END IF;

       ELSE /*GRAVAR EFETIVOS AJUSTADOS SEM TURNO*/
          SELECT COUNT(*)
            INTO V_EXISTE
            FROM TRAB_APURAC_GD
           WHERE CDFILIALAPGD   = P_CDFILIAL            AND
                 NRAPURACGD     = P_NRAPURACFAT         AND
                 CDCLIENTEAPGD  = REC_GDIRETA.CDCLIENTE AND
                 CDSERVFILIAPGD = V_CDSERVFILI          AND
                 NMSERVICOGD    = V_NMSERVICO           AND
                 (DTAPURACFATGD = REC_GDIRETA.DTFATURAM OR (NVL(P_GERAPREVIA, 'S') NOT IN ('R', 'RE'))) AND
                 ROUND(VRPRECUNITAPGD, 5) = ROUND(V_VRSERVICO, 5) 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_CDFILIAL, P_NRAPURACFAT, REC_GDIRETA.CDCLIENTE,
                     V_CDSERVFILI, REC_GDIRETA.DTFATURAM, 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', P_NRAPURACENTRAL, P_CDFILIALCENTRAL, V_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_CDFILIAL            AND
                    NRAPURACGD     = P_NRAPURACFAT         AND
                    CDCLIENTEAPGD  = REC_GDIRETA.CDCLIENTE AND
                    CDSERVFILIAPGD = V_CDSERVFILI          AND
                    ROUND(VRPRECUNITAPGD, 5) = ROUND(V_VRSERVICO, 5) AND
                    (DTAPURACFATGD = REC_GDIRETA.DTFATURAM OR (NVL(P_GERAPREVIA, 'S') NOT IN ('R', 'RE'))) AND
                    NMSERVICOGD = V_NMSERVICO AND
                    NVL(CDGRSERVFAT, ' ') = NVL(V_CDGRSERVFAT_ATUAL, ' ');
          END IF;

       END IF;
       IF (NVL(P_GERAPREVIA, 'S') NOT IN ('R', 'RE')) THEN
          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;
       END IF;
    END LOOP;
    CLOSE CUR_GDIRETA;

    IF (NVL(P_GERAPREVIA, 'S') NOT IN ('R', 'RE')) THEN
       /* CHAMADA A ROTINA DE COMPENSACAO - SE N?O ATINGIR O MINIMO DE EFETIVOS, ENTAO LAN?A UM REGISTRO DE COMPENSACAO. 
          SE ESTIVER PARAMETRIZADO PARA NAO GERAR NF SEPARADA ENTAO INSERE UM REGISTRO NA TRAB_APURAC_GD PARA SAIR UM ITEM NA NF DE APURACAO*/
       DELETE 
         FROM CTRLCOMPENSACAO 
        WHERE NRAPURACCOMP = P_NRAPURACFAT
          AND CDFILIAL = P_CDFILIAL;
       /*VERIFICA SE EXISTE PARAMETRIZACAO DE COMPENSACAO E INSERE REGISTRO DE COMPENSACAO CASO O SERVICO NAO POSSUA O MINIMO DE EFETIVOS*/
       UTIL_APURAC.INSERE_COMPENSACAO(P_CDFILIAL, V_CDFILIAPUR, P_CDCLIENTE, P_DATAINI, P_DATAFIM, P_NRAPURACFAT, P_NRAPURACENTRAL, P_CDFILIALCENTRAL);

       /*CHAMADA DA ROTINA DE MININMO DE EFETIVOS POR MES, INSERINDO O ITEM NA TRAB_APURAC_GD*/
       UTIL_APURAC.INSERE_MINIMO_EFET_MES (P_CDFILIAL, V_CDFILIAPUR, P_CDCLIENTE, P_DATAINI, P_DATAFIM, P_NRAPURACFAT,STIDUTEFEPLA, P_NRAPURACENTRAL, P_CDFILIALCENTRAL);
    END IF;         

    /*LOOP PARA CONFIGURA??O DE GRUPOS PARA NF*/ 
    V_NRGRUPONF := 0;
    V_CDGRSERVFAT := 'XXX';
    V_CONTITEM := 1;
    V_CDSERVFILI := 'XXXXX';
    V_SEQUENCIAL := 1;
    FOR C_GRUPONF IN (SELECT A.NRAPURAC, A.CDFILIAL, A.CDCLIENTE, A.CDSERVFILI, A.CDTURNO, A.VRPRECOUNIT, A.CDPRODUTO, A.DSPRODUTO, A.NREFETIVOS, A.NMSERVICO, 
                             NVL(A.CDGRSERVFAT, ' ') AS CDGRSERVFAT, NVL(GS.CDTIPOOPER,A.CDTIPOOPER) AS CDTIPOOPER, A.VRDESCONTO, A.DSJUSTIFICATIVA, A.NRGRUPONF, A.NRPEDIDO, S.IDSERVFATSEP, A.TABELA
                        FROM(
                      SELECT NRAPURACGD AS NRAPURAC, CDFILIALAPGD 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, 'GD' AS TABELA 
                      FROM TRAB_APURAC_GD WHERE CDFILIALAPGD = P_CDFILIAL AND NRAPURACGD = P_NRAPURACFAT AND CDCLIENTEAPGD = P_CDCLIENTE
                      UNION ALL 
                      SELECT NRAPURACTU AS NRAPURAC, CDFILIALAPTU 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, 'TU' AS TABELA
                      FROM TRAB_APURAC_TU WHERE CDFILIALAPTU = P_CDFILIAL AND NRAPURACTU = P_NRAPURACFAT AND CDCLIENTEAPTU = P_CDCLIENTE) A 
                      INNER JOIN SERVICO S ON S.CDFILIAL = V_CDFILIAPUR AND S.CDSERVFILI = A.CDSERVFILI
					  LEFT JOIN GRUPSERVFAT GS ON GS.CDFILIAL = V_CDFILIAPUR AND GS.CDCLIENTE = A.CDCLIENTE AND GS.CDGRSERVFAT = A.CDGRSERVFAT
                      ORDER BY CDCLIENTE, CDFILIAL, NVL(A.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,
                 CDTIPOOPER = NVL(C_GRUPONF.CDTIPOOPER, V_CDTIPOOPER),
                 VRDESCONTO = 0,
                 NRSEQUENCIAL = V_SEQUENCIAL
           WHERE CDFILIALAPGD   = P_CDFILIAL
             AND NRAPURACGD     = P_NRAPURACFAT
             AND CDCLIENTEAPGD  = C_GRUPONF.CDCLIENTE
             AND CDSERVFILIAPGD = C_GRUPONF.CDSERVFILI
             AND ROUND(VRPRECUNITAPGD, 5) = ROUND(C_GRUPONF.VRPRECOUNIT, 5)
             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,
                 CDTIPOOPER = NVL(C_GRUPONF.CDTIPOOPER, V_CDTIPOOPER),
                 VRDESCONTO = 0,
                 NRSEQUENCIAL   = V_SEQUENCIAL
           WHERE CDFILIALAPTU   = P_CDFILIAL
             AND NRAPURACTU     = P_NRAPURACFAT
             AND CDCLIENTEAPTU  = C_GRUPONF.CDCLIENTE
             AND CDSERVFILIAPTU = C_GRUPONF.CDSERVFILI
             AND ROUND(VRPRECUNITAPTU, 5) = ROUND(C_GRUPONF.VRPRECOUNIT, 5)
             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 P_IDGERANOTA IS NULL OR P_IDGERANOTA <> 'N' THEN
    /* APAGA TODAS AS NOTAS FISCAIS APURADAS ANTERIORMENTE COM MESMO NUMERO DE APURACAO */
    IF (V_COMPENSACAO = 'N') THEN 
       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;
    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    = 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,
                     CDFILIALAPGD AS CDSERVFILI
                FROM TRAB_APURAC_GD
               WHERE CDFILIALAPGD  = P_CDFILIAL    AND
                     NRAPURACGD    = P_NRAPURACFAT AND
                     CDCLIENTEAPGD = P_CDCLIENTE
              UNION ALL
              SELECT NVL(NREFETIVOSAPTU,0) AS NREFETIVOS, NVL(VRPRECUNITAPTU * NREFETIVOSAPTU,0) AS VRSERVICO,
                     CDFILIALAPTU AS CDSERVFILI
                FROM TRAB_APURAC_TU
                WHERE CDFILIALAPTU  = P_CDFILIAL AND
                      NRAPURACTU    = 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);

          -- Sobrescreve identificador de presenca default
          IF V_IDPRESENCIALFAIGD IS NOT NULL THEN
             UPDATE NOTAFISCAL
                SET IDPRESENCIAL = V_IDPRESENCIALFAIGD
              WHERE CDFILIAL = P_CDFILIAL
                AND NRLANCTONF = V_NRLANCTONF;
          END IF;
       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);   
                -- Sobrescreve identificador de presenca default
                IF V_IDPRESENCIALFAIGD IS NOT NULL THEN
                   UPDATE NOTAFISCAL
                      SET IDPRESENCIAL = V_IDPRESENCIALFAIGD
                    WHERE CDFILIAL = P_CDFILIAL
                      AND NRLANCTONF = V_NRLANCTONF;
                END IF;
             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;
          
          /*SE ESTIVER USANDO VENDA ANTECIPADA OU LANCANDO O ITEM DA NF REFERENTE A COMPENSACAO NAO GRAVA HISTORICO*/
          IF (V_IDUTILADIANT = 'N' AND V_COMPENSACAO = 'N') THEN  
             
             IF REC_CURS_APURAC.UTILSERVEQUI = 'S' THEN
                SELECT MIN(CDSERVFILI)
                  INTO V_CDSERVORI
                  FROM SERVICO 
                 WHERE CDFILIAL = V_CDFILIAPUR AND
                       CDSERVPREQUI = REC_CURS_APURAC.CDSERVFILI;
             ELSE 
                V_CDSERVORI := NULL;
             END IF;
             /*INSERE O HISTORICO DO ITEM DA NF*/
             INSERE_HISTORICO(REC_CURS_APURAC.DTAPURACFAT, 
                              V_CDFILIAPUR, 
                              REC_CURS_APURAC.CDSERVFILI, 
                              REC_CURS_APURAC.CDTURNO, 
                              REC_CURS_APURAC.NMSERVICO, 
                              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.CDPRODUTO, 
                              V_CDSERVORI, /*SERVICO DE ORIGEM DA EQUIVALENCIA*/
                              REC_CURS_APURAC.UTILSERVEQUI, 
                              REC_CURS_APURAC.IDAJUSEFET, 
                              REC_CURS_APURAC.IDPRODSUBS, 
                              REC_CURS_APURAC.NREFETIVOS, 
                              REC_CURS_APURAC.VRPRECOUNIT, 
                              REC_CURS_APURAC.CDGRSERVFAT,
                              REC_CURS_APURAC.NRGRUPONF,
                              REC_CURS_APURAC.CDTIPOOPER);
          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);

          -- Sobrescreve identificador de presenca default
          IF V_IDPRESENCIALFAIGD IS NOT NULL THEN
             UPDATE NOTAFISCAL
                SET IDPRESENCIAL = V_IDPRESENCIALFAIGD
              WHERE CDFILIAL = P_CDFILIAL
                AND NRLANCTONF = V_NRLANCTONF;
          END IF;

          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 CDFILIALAPGD  = P_CDFILIAL    AND
          NRAPURACGD    = P_NRAPURACFAT;

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