CREATE OR REPLACE PROCEDURE CTB_REC_LANC(
   P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
   P_NRLANCTONF   IN NOTAFISCAL.NRLANCTONF%TYPE,
   P_NRPARCELAREC IN CONTARECEBER.NRPARCELAREC%TYPE,
   P_NRSEQVENREC  IN CONTARECEBER.NRSEQVENREC%TYPE,
   P_DTAJUSTEREC  IN AJCTRECEBER.DTAJUSTEREC%TYPE,
   P_CDAJUCTREC   IN AJCTRECEBER.CDAJUCTREC%TYPE,
   P_IDTIPO       IN VARCHAR2,
   P_NRLANCCTB    OUT LANCCONT.NRLANCCONT%TYPE)
AS
   V_NRLANCTEMP  NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_CDCLIENTEAUX NOTAFISCAL.CDCLIENTE%TYPE;
   V_CDCENTCUST FILIAL.CDCENTCUST%TYPE;
   V_CDFILIAL   FILIAL.CDFILIAL%TYPE;
   V_VRRATEIO   LANCCONT.VRLANCAMENT%TYPE;
   V_CDHISTPADR HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTLANC LANCCONT.DSHISTLANC%TYPE;
   V_CDCONTCTBL CONTCTBL.CDCONTCTBL%TYPE;
   V_IDTIPOCOME CONTCTBL.IDTIPOCOME%TYPE;
   V_IDCONTCCUS CONTCTBL.IDCONTCCUS%TYPE;
   V_COUNT      INTEGER;
   V_SEQUENCIAL LANCCTBTEMP.NRSEQCTBTEMP%TYPE;
   V_RATSEQ     INTEGER;
   V_CONTRAT    VARCHAR2(01);
   V_FATOR      INTEGER;
   V_ENTROULOOP VARCHAR2(01);
   V_PERCENTUAL NUMBER;
   V_RATEIOCONTA VARCHAR2(01);
   V_COUNTRAT   NUMBER;
   
   PROCEDURE BUSCA_TPCOMERCIAL(P_CDCONTCTBL IN VARCHAR2,
                               P_IDCOME     OUT VARCHAR2,
                               P_IDCCUS     OUT VARCHAR2)
   AS
      V_IDCODCOME VARCHAR2(01);
      V_IDCCUS VARCHAR2(21);
   BEGIN
      BEGIN
         SELECT NVL(IDTIPOCOME, 'N') IDTIPOCOME, IDCONTCCUS
           INTO V_IDCODCOME, V_IDCCUS
           FROM CONTCTBL
          WHERE CDCONTCTBL = P_CDCONTCTBL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDCODCOME  := 'N';
            V_IDCONTCCUS := 'L';
      END;
      P_IDCOME := V_IDCODCOME;
      P_IDCCUS := V_IDCCUS;
   END;

   FUNCTION BUSCA_CCUSTO(P_CDFILIAL IN VARCHAR, P_CDEMPRESA IN VARCHAR) RETURN VARCHAR
   IS
      V_CDCENTCUST VARCHAR2(04);
   BEGIN
      BEGIN
         SELECT CDCENTCUST
           INTO V_CDCENTCUST
           FROM FILIAL
          WHERE CDFILIAL = P_CDFILIAL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDCENTCUST := NULL;
      END;

      IF V_CDCENTCUST IS NULL THEN
         BEGIN
            SELECT CDCENTCUST
              INTO V_CDCENTCUST
              FROM EMPRESA
             WHERE CDEMPRESA = P_CDEMPRESA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCENTCUST := NULL;
         END;
      END IF;
      RETURN(V_CDCENTCUST);
   END;

BEGIN
   IF P_IDTIPO = 'D' THEN
      FOR C_CONTA IN (SELECT CR.CDEMPRESA, CR.CDTPCTRECEB, NF.CDFILIEMIT, NF.CDCLIENTE,
                             NF.NRNOTAFISC, NF.DTEMISSAO, CR.VRATUAREC, NF.IDSTATUS,
                             TP.CDHISTPADR, TP.CDCONTCTBL, NF.VRNOTAFISC, NVL(NF.CDSERIE, '') CDSERIE,
                             NF.IDSISTEMA 
                        FROM CONTARECEBER CR, NOTAFISCAL NF, TIPOCTRECEBER TP, HISTPADR H
                       WHERE CR.CDFILIAL = P_CDFILIAL
                         AND CR.NRLANCTONF = P_NRLANCTONF
                         AND CR.NRSEQVENREC = P_NRSEQVENREC
                         AND CR.NRPARCELAREC = P_NRPARCELAREC
                         AND CR.CDFILIAL = NF.CDFILIAL
                         AND CR.NRLANCTONF = NF.NRLANCTONF
                         AND CR.CDTPCTRECEB = TP.CDTPCTRECEB
                         AND TP.IDCTBLCTREC = 'S'
                         AND TP.CDHISTPADR = H.CDHISTPADR(+)
                         AND NF.IDSISTEMA = 'REC') LOOP

         /* VERIFICA SE A EMPRESA RESPONSAVEL PELA CONTA UTILIZA A GERECAO DE RATEIO DO LANCAMENTO CONTABIL  N- NAO S-SIM
         VERIFICA SE OS VALORES DE PARTIDAS IRAO ACUMULAR, CASO A CONTA CONTABIL SEJA A MESMA*/
         SELECT IDCONTGERE
           INTO V_CONTRAT
           FROM CONTOPECTBL
          WHERE CDEMPRESA = C_CONTA.CDEMPRESA;

         BEGIN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM PARAMCTBL
             WHERE C_CONTA.DTEMISSAO >= DTINTCTBREC;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;

         IF V_COUNT > 0 THEN
            IF C_CONTA.IDSTATUS = 'A' THEN
               /* DELETA TODOS OS REGISTROS TEMPORARIOS PARA ESSE LANCAMENTO */
               BEGIN
                  SELECT NRLANCTBDOC
                    INTO V_NRLANCTEMP
                    FROM NOTAFISCAL NF
                   WHERE NF.CDFILIAL = P_CDFILIAL
                     AND NF.NRLANCTONF = P_NRLANCTONF;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_NRLANCTEMP := NULL;
               END;

               IF V_NRLANCTEMP IS NOT NULL THEN
                  /* DELETA OS RATEIOS DO LANCAMENTO CONTABIL */
                  DELETE
                    FROM LANCCCUSTO
                   WHERE NRLANCCONT = V_NRLANCTEMP
                     AND CDEMPRESA  = C_CONTA.CDEMPRESA;

                  /* DELETA AS PARTIDAS DO LANCAMENTO CONTABIL */
                  DELETE
                    FROM LANCCONT
                   WHERE NRLANCCONT = V_NRLANCTEMP
                     AND CDEMPRESA  = C_CONTA.CDEMPRESA;

                  DELETE FROM LANCCTBTEMP
                   WHERE NRLANCCTBTEMP = V_NRLANCTEMP
                     AND CDEMPRESA     = C_CONTA.CDEMPRESA;

                  DELETE FROM RATECTBTEMP
                   WHERE NRLANCCTBTEMP = V_NRLANCTEMP
                     AND CDEMPRESA     = C_CONTA.CDEMPRESA;
               END IF;

               /* CASO A VARIAVEL QUE RECEBE O NUMERO DO LANCAMENTO CONTABIL SEJA NULA, E PORQUE O LANCAMENTO CONTABIL E NOVO. */
               IF V_NRLANCTEMP IS NULL THEN
                  /* PEGA UM NOVO NUMERO DE LANCAMENTO CONTABIL, CASO O LANCAMENTO NO REC SEJA NOVO */
                  NOVO_CODIGO_NT('LANCCONTABIL' || C_CONTA.CDEMPRESA || TO_CHAR(C_CONTA.DTEMISSAO,'YYYYMM'), V_NRLANCTEMP);
                  V_NRLANCTEMP := TO_CHAR(C_CONTA.DTEMISSAO,'YYYYMM')||SUBSTR(V_NRLANCTEMP, 15, 6);
               END IF;

               /* BUSCA HISTORICO PADRAO DE INTEGRACAO DO REC*/
               BEGIN
                  SELECT HI.CDHISTPADR
                    INTO V_CDHISTPADR
                    FROM HISTINTEGRA HI, HISTPADR HP
                   WHERE HI.CDHISTPADR = HP.CDHISTPADR
                     AND HI.CDOPERACAO = 'CTAREC';
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_CDHISTPADR := NULL;
                  END;
               END;

               /* VERIFICA SE EXISTE HISTORIO CADASTRADO NO TIPO DE CONTA, CASO NAO EXISTA PEGA DO HISTORICO DE INTEGRACAO REC */
               IF C_CONTA.CDHISTPADR IS NOT NULL THEN
                  V_CDHISTPADR := C_CONTA.CDHISTPADR;
               END IF;

               /* FORMATA A DESCRICAO DO HISTORICO PADRAO BUSCADO, DO TIPO DE CONTA OU DE INTEGRACAO */
               V_DSHISTLANC := CTB_HIST_REC(V_CDHISTPADR, P_CDFILIAL, P_NRLANCTONF, P_NRSEQVENREC, P_NRPARCELAREC, P_CDAJUCTREC);

               /* DEBITA NA CONTA CONTABIL DE CLIENTE */
               V_CDCONTCTBL := CTB_CCCLIENTE(C_CONTA.CDCLIENTE, C_CONTA.CDFILIEMIT, C_CONTA.CDEMPRESA);

               BUSCA_TPCOMERCIAL(V_CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);

               /*VERIFICA O TIPO DE CODIGO COMERCIAL, CASO SEJA DIFERENTE DE CLIENTE, E PASSADO NULO PARA A PARTIDA.
               O N E TRATADO NA HORA DE PASSAR PARA A LANCCONT NA PROCEDURE GRAVA_LANC_CTB */
               V_CDCLIENTEAUX := C_CONTA.CDCLIENTE;
               IF V_IDTIPOCOME <> 'C' THEN
                  V_CDCLIENTEAUX := NULL;
                  V_IDTIPOCOME   := 'N';
               END IF;

               INSERT INTO LANCCTBTEMP
                  (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP, CDCONTCTBL, CDHISTPADR,
                   DSHISTCTB, DTLANCCTBTEMP, VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
               VALUES
                  (C_CONTA.CDEMPRESA, V_NRLANCTEMP, C_CONTA.NRNOTAFISC, '00001', V_CDCONTCTBL, V_CDHISTPADR,
                   V_DSHISTLANC, C_CONTA.DTEMISSAO, C_CONTA.VRNOTAFISC * -1, V_IDTIPOCOME, V_CDCLIENTEAUX, 'REC');

               /* VERIFICA SE A EMPRESA GERA O RATEIO CONTABIL. */
               IF V_CONTRAT = 'S' THEN
                  /* VERIFICA SE A CONTA NAO E "SO OFICIAL"*/
                  IF V_IDCONTCCUS <> 'O' THEN
                     V_CDCENTCUST := BUSCA_CCUSTO(C_CONTA.CDFILIEMIT, C_CONTA.CDEMPRESA);
                     INSERT INTO RATECTBTEMP
                        (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                     VALUES
                        (C_CONTA.CDEMPRESA, V_NRLANCTEMP, '00001', C_CONTA.CDFILIEMIT, V_CDCENTCUST, C_CONTA.VRNOTAFISC * -1, C_CONTA.DTEMISSAO, '00001');
                  END IF;
               END IF;

               /* CREDITA NO TIPO DE CONTA A RECEBER */
               BUSCA_TPCOMERCIAL(C_CONTA.CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);

               /* FAZ A MESMA VERIFICACAO SE A CONTA CONTABIL E DO TIPO CLIENTE */
               V_CDCLIENTEAUX := C_CONTA.CDCLIENTE;
               IF V_IDTIPOCOME <> 'C' THEN
                  V_CDCLIENTEAUX := NULL;
                  V_IDTIPOCOME   := 'N';
               END IF;

               INSERT INTO LANCCTBTEMP
                  (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP, CDCONTCTBL, CDHISTPADR,
                   DSHISTCTB, DTLANCCTBTEMP, VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
               VALUES
                  (C_CONTA.CDEMPRESA, V_NRLANCTEMP, C_CONTA.NRNOTAFISC, '00002', C_CONTA.CDCONTCTBL, V_CDHISTPADR,
                   V_DSHISTLANC, C_CONTA.DTEMISSAO, C_CONTA.VRNOTAFISC, V_IDTIPOCOME, V_CDCLIENTEAUX, 'REC');

               IF V_CONTRAT = 'S' THEN
                  /* VERIFICA SE A CONTA CONTABIL DE CREDITO NAO E "SO OFICIAL" */
                  IF V_IDCONTCCUS <> 'O' THEN
                     V_VRRATEIO := 0;
                     V_RATSEQ   := 1;
                     V_ENTROULOOP := 'N';

                     /* COUNT USADO PARA VERIFICAR SE EXISTE RATEIO PADRONIZADO PARA O TIPO DE CONTA A RECEBER
                        NA TELA PARAMETROS PARA CENTRO DE CUSTO */
                     FOR C_RATCTRECEBER IN
                         (SELECT CDCENTCUST, CDFIRATTPCTR, CDFILIAL, (VRPERATTPCTR/100) AS VRPERATTPCTR
                            FROM RATTPCTR
                           WHERE CDTPCTRECEB = C_CONTA.CDTPCTRECEB) LOOP

                         V_ENTROULOOP := 'S';

                         /* FAZ O SOMATORIO DOS VALORES RATEADOS PARA VER SE DA DIFERENCA DE ARREDONDAMENTO NO FINAL */
                         V_PERCENTUAL := ROUND((C_CONTA.VRNOTAFISC * C_RATCTRECEBER.VRPERATTPCTR), 2);
                         --V_PERCENTUAL := ROUND((C_CONTA.VRNOTAFISC * V_PERCENTUAL)/100, 2);
                         V_VRRATEIO := V_VRRATEIO + V_PERCENTUAL;
                         IF C_RATCTRECEBER.CDFILIAL IS NOT NULL THEN
                            V_CDFILIAL := C_RATCTRECEBER.CDFIRATTPCTR;
                            BEGIN
                               SELECT COUNT(*)
                                 INTO V_COUNTRAT
                                 FROM RATECTBTEMP
                                WHERE CDEMPRESA = C_CONTA.CDEMPRESA
                                  AND NRLANCCTBTEMP = V_NRLANCTEMP
                                  AND NRSEQCTBTEMP = '00002'
                                  AND CDFILIAL = V_CDFILIAL
                                  AND CDCENTCUST = C_RATCTRECEBER.CDCENTCUST;
                            EXCEPTION
                                WHEN NO_DATA_FOUND THEN
                                V_COUNTRAT := 0;
                            END;
                            IF V_COUNTRAT = 0 THEN
                               INSERT INTO RATECTBTEMP
                                  (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                               VALUES
                                  (C_CONTA.CDEMPRESA, V_NRLANCTEMP, '00002', C_RATCTRECEBER.CDFIRATTPCTR, C_RATCTRECEBER.CDCENTCUST,
                                   V_PERCENTUAL, C_CONTA.DTEMISSAO, LPAD(TO_CHAR(V_RATSEQ),5,'0'));
                            ELSE
                               UPDATE RATECTBTEMP
                                  SET VRRATECTBTEMP = VRRATECTBTEMP + V_PERCENTUAL
                                WHERE CDEMPRESA = C_CONTA.CDEMPRESA
                                  AND NRLANCCTBTEMP = V_NRLANCTEMP
                                  AND NRSEQCTBTEMP = '00002'
                                  AND CDFILIAL = V_CDFILIAL
                                  AND CDCENTCUST = C_RATCTRECEBER.CDCENTCUST;
                            END IF;
                         ELSE
                            V_CDFILIAL := C_CONTA.CDFILIEMIT;
                            V_CDCENTCUST := BUSCA_CCUSTO(C_CONTA.CDFILIEMIT, C_CONTA.CDEMPRESA);
                            BEGIN
                               SELECT COUNT(*)
                                 INTO V_COUNTRAT
                                 FROM RATECTBTEMP
                                WHERE CDEMPRESA = C_CONTA.CDEMPRESA
                                  AND NRLANCCTBTEMP = V_NRLANCTEMP
                                  AND NRSEQCTBTEMP = '00002'
                                  AND CDFILIAL = V_CDFILIAL
                                  AND CDCENTCUST = V_CDCENTCUST;
                            EXCEPTION
                                WHEN NO_DATA_FOUND THEN
                                V_COUNTRAT := 0;
                            END;
                            IF V_COUNTRAT = 0 THEN

                               INSERT INTO RATECTBTEMP
                                  (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                               VALUES
                                  (C_CONTA.CDEMPRESA, V_NRLANCTEMP, '00002', V_CDFILIAL, V_CDCENTCUST,
                                   V_PERCENTUAL, C_CONTA.DTEMISSAO, LPAD(TO_CHAR(V_RATSEQ),5,'0'));
                            ELSE
                               UPDATE RATECTBTEMP
                                  SET VRRATECTBTEMP = VRRATECTBTEMP + V_PERCENTUAL
                                WHERE CDEMPRESA = C_CONTA.CDEMPRESA
                                  AND NRLANCCTBTEMP = V_NRLANCTEMP
                                  AND NRSEQCTBTEMP = '00002'
                                  AND CDFILIAL = V_CDFILIAL
                                  AND CDCENTCUST = V_CDCENTCUST;
                            END IF;
                         END IF;
                     END LOOP;

                     IF V_ENTROULOOP = 'N' THEN
                        V_VRRATEIO := 0;
                        V_RATEIOCONTA := 'S';
                        FOR C_RATEIO IN
                           (SELECT CDCENTCUST, CDFIRATCTREC, VRRATCCCTREC
                              FROM RATCTRECEBER
                             WHERE CDFILIAL = P_CDFILIAL
                               AND NRLANCTONF = P_NRLANCTONF
                               AND NRSEQVENREC = P_NRSEQVENREC
                               AND NRPARCELAREC = P_NRPARCELAREC) LOOP
                           IF C_CONTA.VRATUAREC = 0 THEN
                              V_RATEIOCONTA := 'N';
                           ELSE
                              V_PERCENTUAL := ROUND((C_RATEIO.VRRATCCCTREC * 100) / C_CONTA.VRATUAREC, 2);
                              V_PERCENTUAL := ROUND((V_PERCENTUAL * C_CONTA.VRNOTAFISC) / 100, 2);
                              V_ENTROULOOP := 'S';
                              V_VRRATEIO := V_VRRATEIO + V_PERCENTUAL;
                              V_CDCENTCUST := C_RATEIO.CDCENTCUST;
                              INSERT INTO RATECTBTEMP
                                 (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                              VALUES
                                 (C_CONTA.CDEMPRESA, V_NRLANCTEMP, '00002', C_RATEIO.CDFIRATCTREC, V_CDCENTCUST,
                                  V_PERCENTUAL, C_CONTA.DTEMISSAO, LPAD(TO_CHAR(V_RATSEQ),5,'0'));
                              V_CDFILIAL := C_RATEIO.CDFIRATCTREC;
                              V_RATSEQ := V_RATSEQ + 1;
                           END IF;
                        END LOOP;
                        IF ((V_ENTROULOOP = 'N') OR (V_RATEIOCONTA = 'N')) THEN
                           /* CASO NAO TENHA FILIAL CADASTRADA NA TELA PARAMETROS PARA CENTRO DE CUSTO, E FEITO O RATEIO PARA A FILIAL DE EMISSAO */
                           V_VRRATEIO := C_CONTA.VRNOTAFISC;
                           V_CDCENTCUST := BUSCA_CCUSTO(C_CONTA.CDFILIEMIT, C_CONTA.CDEMPRESA);
                           INSERT INTO RATECTBTEMP
                              (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                           VALUES
                              (C_CONTA.CDEMPRESA, V_NRLANCTEMP, '00002', C_CONTA.CDFILIEMIT, V_CDCENTCUST,
                               C_CONTA.VRNOTAFISC, C_CONTA.DTEMISSAO, LPAD(TO_CHAR(V_RATSEQ),5,'0'));
                           V_CDFILIAL := C_CONTA.CDFILIEMIT;
                           V_CDCENTCUST := V_CDCENTCUST;
                           V_RATSEQ := V_RATSEQ + 1;
                        END IF;
                     END IF;

                     /* VERIFICA SE O VALOR TOTAL RATEADO E IGUAL AO VALOR DA NOTA FISCAL. CASO NAO SEJA, E
                        FEITO O RATEIO PARA A ULTIMA FILAL E CENTRO DE CUSTO RATEADO */
                     IF V_VRRATEIO <> C_CONTA.VRNOTAFISC THEN
                        V_VRRATEIO := V_VRRATEIO - C_CONTA.VRNOTAFISC;
                        IF V_VRRATEIO > 0 THEN
                           V_VRRATEIO := - V_VRRATEIO;
                        END IF;
                        UPDATE RATECTBTEMP
                           SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRRATEIO
                         WHERE CDEMPRESA     = C_CONTA.CDEMPRESA
                           AND NRLANCCTBTEMP = V_NRLANCTEMP
                           AND NRSEQCTBTEMP  = '00002'
                           AND CDFILIAL      = V_CDFILIAL
                           AND CDCENTCUST    = V_CDCENTCUST;
                     END IF;
                  END IF;
               END IF;
               /*VERIFICACAO DE ERROS NAS PARTIDAS E NO LANCAMENTO CONTABIL*/
               VERIFICA_ERRO_CTB(V_NRLANCTEMP, C_CONTA.CDEMPRESA);
               BEGIN
                  SELECT COUNT(*)
                    INTO V_COUNT
                    FROM ERROCTBTEMP
                   WHERE CDEMPRESA = C_CONTA.CDEMPRESA
                     AND NRLANCCTBTEMP = V_NRLANCTEMP;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_COUNT := 0;
               END;

               /* SE O LANCAMENTO NAO TER ERROS, E GRAVADO O NUMERO DE LANCAMENTO CONTABIL NA NOTA FISCAL */
               IF V_COUNT = 0 THEN
                  UPDATE NOTAFISCAL
                     SET NRLANCTBDOC = V_NRLANCTEMP
                   WHERE NRLANCTONF   = P_NRLANCTONF
                     AND CDFILIAL     = P_CDFILIAL;
               END IF;
               P_NRLANCCTB := V_NRLANCTEMP;
               /* TERMINO DAS PARTIDAS DO LANCAMENTO CONTABIL*/
                /* GRAVA O LANCAMENTO TEMPORARIO SE NAO CONTER ERRO NA LANCCONT E LANCCUSTO, APOS GRAVAR IRA APAGAR O LANCAMENTO TEMPORARIO */
               GRAVA_LANC_CTB(V_NRLANCTEMP, C_CONTA.CDEMPRESA);
            END IF;
         END IF;
      END LOOP;
   ELSIF P_IDTIPO = 'A' THEN
      /*----------------------------------------------------------------------*/
      /* Contabilizacao de ajuste da aba ajuste da tela de contas a a receber */
      /*----------------------------------------------------------------------*/
      /* FILTRA O AJUSTE QUE ACABOU DE SER INSERIDO NA TELA PARA CONTABILIZAR */
      FOR AJUSTE IN
         (SELECT NF.CDEMPRESA, A.CDFILIAL, A.NRLANCTONF, A.NRSEQVENREC, A.NRPARCELAREC,
                 A.DTAJUSTEREC, A.CDAJUCTREC, T.DSAJUCTREC, T.CDHISTPADR,
                 ROUND(A.VRAJUSTEREC, 2) VRAJUSTEREC, T.IDAJUCTREC, T.CDCONTCTBL,
                 NF.CDCLIENTE, NF.CDFILIEMIT, A.NRLCTBAJREC,
                 NF.CDSERIE, NRNOTAFISC
           FROM AJCTRECEBER A, TIPOAJRECEBER T, NOTAFISCAL NF, HISTPADR H
          WHERE A.CDFILIAL = P_CDFILIAL
            AND A.NRLANCTONF = P_NRLANCTONF
            AND A.NRSEQVENREC = P_NRSEQVENREC
            AND A.NRPARCELAREC = P_NRPARCELAREC
            AND A.DTAJUSTEREC = P_DTAJUSTEREC
            AND A.CDAJUCTREC = P_CDAJUCTREC
            AND A.CDAJUCTREC = T.CDAJUCTREC
            AND NF.CDFILIAL = A.CDFILIAL
            AND NF.NRLANCTONF = A.NRLANCTONF
            AND T.CDHISTPADR = H.CDHISTPADR(+)
            AND EXISTS (SELECT 1
                          FROM LANCCONT L
                         WHERE L.CDEMPRESA = NF.CDEMPRESA
                           AND L.NRLANCCONT = NF.NRLANCTBDOC)
          ORDER BY A.CDFILIAL, A.NRLANCTONF, A.CDAJUCTREC) LOOP

         /* VERIFICA SE A EMPRESA RESPONSAVEL PELA CONTA UTILIZA A  GERECAO DE RATEIO DO LANCAMENTO CONTABIL  N- NAO S-SIM
         VERIFICA SE OS VALORES DE PARTIDAS IRAO ACUMULAR, CASO A CONTA CONTABIL SEJA A MESMA*/
         SELECT IDCONTGERE
           INTO V_CONTRAT
           FROM CONTOPECTBL
          WHERE CDEMPRESA = AJUSTE.CDEMPRESA;

         BEGIN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM PARAMCTBL
             WHERE AJUSTE.DTAJUSTEREC >= DTINTCTBREC;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;

         IF V_COUNT > 0 THEN
            V_NRLANCTEMP := AJUSTE.NRLCTBAJREC;
            IF V_NRLANCTEMP IS NOT NULL THEN
               /* DELETA OS RATEIOS DO LANCAMENTO CONTABIL */
               DELETE
                 FROM LANCCCUSTO
                WHERE NRLANCCONT = V_NRLANCTEMP
                  AND CDEMPRESA  = AJUSTE.CDEMPRESA;

               /* DELETA AS PARTIDAS DO LANCAMENTO CONTABIL */
               DELETE
                 FROM LANCCONT
                WHERE NRLANCCONT = V_NRLANCTEMP
                  AND CDEMPRESA  = AJUSTE.CDEMPRESA;

               /* DELETA OS REGISTROS TEMPORARIOS CASO EXISTA */
               DELETE FROM LANCCTBTEMP
                WHERE NRLANCCTBTEMP = V_NRLANCTEMP
                  AND CDEMPRESA     = AJUSTE.CDEMPRESA;

               DELETE FROM RATECTBTEMP
                WHERE NRLANCCTBTEMP = V_NRLANCTEMP
                  AND CDEMPRESA     = AJUSTE.CDEMPRESA;
            END IF;

            /* CASO A VARIAVEL QUE RECEBE O NUMERO DO LANCAMENTO CONTABIL SEJA NULA, E PORQUE O LANCAMENTO CONTABIL E NOVO. */
            IF V_NRLANCTEMP IS NULL THEN
               /* PEGA UM NOVO NUMERO DE LANCAMENTO CONTABIL, CASO O AJUSTE NO REC SEJA NOVO */
               NOVO_CODIGO_NT('LANCCONTABIL' || AJUSTE.CDEMPRESA || TO_CHAR(P_DTAJUSTEREC,'YYYYMM'), V_NRLANCTEMP);
               V_NRLANCTEMP := TO_CHAR(P_DTAJUSTEREC,'YYYYMM')||SUBSTR(V_NRLANCTEMP, 15, 6);
            END IF;

            /* VERIFICA SE E UM AJUSTE DE DESCONTO OU ACRESCIMO */
            IF AJUSTE.IDAJUCTREC = 'D' THEN
               V_FATOR :=  -1;
            ELSE
               V_FATOR := 1;
            END IF;

            V_CDHISTPADR := AJUSTE.CDHISTPADR;

            V_DSHISTLANC := CTB_HIST_REC(V_CDHISTPADR, P_CDFILIAL, P_NRLANCTONF, P_NRSEQVENREC, P_NRPARCELAREC, P_CDAJUCTREC);

            V_CDCONTCTBL := CTB_CCCLIENTE(AJUSTE.CDCLIENTE, AJUSTE.CDFILIEMIT, AJUSTE.CDEMPRESA);

            BUSCA_TPCOMERCIAL(V_CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);

            /* GUARDA O CODIGO DE CLIENTE EM UMA VARIAVEL PARA QUE SEJA POSSIVEL RECUPERA-LO */
            V_CDCLIENTEAUX := AJUSTE.CDCLIENTE;

            /* CASO A CONTA CONTABIL NAO SEJA DO TIPO CLIENTE, A PARTIDA SERA SEM COIDGO COMERCIAL */
            IF V_IDTIPOCOME <> 'C' THEN
               V_CDCLIENTEAUX := NULL;
               V_IDTIPOCOME := 'N';
            END IF;

            INSERT INTO LANCCTBTEMP
               (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP, CDCONTCTBL, CDHISTPADR,
                DSHISTCTB, DTLANCCTBTEMP, VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
            VALUES
               (AJUSTE.CDEMPRESA, V_NRLANCTEMP, AJUSTE.NRNOTAFISC || AJUSTE.CDSERIE, '00001', V_CDCONTCTBL, V_CDHISTPADR,
                V_DSHISTLANC, AJUSTE.DTAJUSTEREC, AJUSTE.VRAJUSTEREC * -1 * V_FATOR, V_IDTIPOCOME, V_CDCLIENTEAUX, 'REC');

            /* VERIFICA SE A EMPRESA CONTROLA O RATEIO CONTABIL */
            IF V_CONTRAT = 'S' THEN
               /* VERIFICA SE A CONTA CONTABIL NAO E "SO OFICIAL" */
               IF V_IDCONTCCUS <> 'O' THEN
                  V_CDCENTCUST := BUSCA_CCUSTO(AJUSTE.CDFILIEMIT, AJUSTE.CDEMPRESA);
                  INSERT INTO RATECTBTEMP
                     (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                  VALUES
                     (AJUSTE.CDEMPRESA, V_NRLANCTEMP, '00001', AJUSTE.CDFILIEMIT, V_CDCENTCUST, AJUSTE.VRAJUSTEREC * V_FATOR * -1, AJUSTE.DTAJUSTEREC, '00001');
               END IF;
            END IF;

            /* DEBITA NO TIPO DE AJUSTE */
            BUSCA_TPCOMERCIAL(AJUSTE.CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);

            /* GUARDA O CODIGO DO CLIENTE */
            V_CDCLIENTEAUX := AJUSTE.CDCLIENTE;

            /* SE A CONTA CONTABIL FOR DIFERENTE DE CLIENTE, E FEITA A PARTIDA SEM CODIGO COMERCIAL */
            IF V_IDTIPOCOME <> 'C' THEN
               V_IDTIPOCOME := 'N';
               V_CDCLIENTEAUX  := NULL;
            END IF;

            INSERT INTO LANCCTBTEMP
               (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP, CDCONTCTBL, CDHISTPADR,
                DSHISTCTB, DTLANCCTBTEMP, VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
            VALUES
               (AJUSTE.CDEMPRESA, V_NRLANCTEMP, AJUSTE.NRNOTAFISC || AJUSTE.CDSERIE, '00002', AJUSTE.CDCONTCTBL, V_CDHISTPADR,
                V_DSHISTLANC, AJUSTE.DTAJUSTEREC, AJUSTE.VRAJUSTEREC * V_FATOR, V_IDTIPOCOME, V_CDCLIENTEAUX, 'REC');

            /* VERIFICA SE A EMPRESA CONTROLA RATEIO CONTABIL */
            IF V_CONTRAT = 'S' THEN
               /* SE A CONTA CONTABIL FOR DIFERENTE DE "SO OFICIAL", SAO FEITOS OS RATEIOS NECESSARIOS */
               IF V_IDCONTCCUS <> 'O' THEN
                  V_ENTROULOOP := 'N';
                  V_RATSEQ   := 1;

                  V_VRRATEIO := 0;
                  /* PEGA OS CENTROS DE CUSTOSM FILIALS E PERCENTUAIS CADASTRADOS NA TELA */
                  FOR RATAJU IN
                     (SELECT CDCENTCUST, CDFIRATTPAJR, CDFILIAL, VRPERATTPAJR
                        FROM RATTPAJR
                       WHERE CDAJUCTREC = P_CDAJUCTREC) LOOP
                     V_ENTROULOOP := 'S';

                     /* FAZ O SOMATORIO DOS RATEIOS DE ACORDO COM OS PERCENTUAIS INFORMADOS NA TELA
                        PARA VERIFICAR SE EXISTE DIFERENCA DE ARREDONDAMENTO POSTERIORMENTE */
                     V_VRRATEIO := V_VRRATEIO + ROUND(((AJUSTE.VRAJUSTEREC * V_FATOR)* RATAJU.VRPERATTPAJR) /100, 2);

                     IF RATAJU.CDFIRATTPAJR = '----' THEN
                        V_CDFILIAL := AJUSTE.CDFILIEMIT;
                     ELSE
                        V_CDFILIAL := RATAJU.CDFIRATTPAJR;
                     END IF;

                     /* CASO TENHA FILIAL CADASTRADA NA TELA, E FEITO O RATEIO PARA ESSA FILIAL */
                     INSERT INTO RATECTBTEMP
                       (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                     VALUES
                        (AJUSTE.CDEMPRESA, V_NRLANCTEMP, '00002', V_CDFILIAL, RATAJU.CDCENTCUST,
                        ROUND(((AJUSTE.VRAJUSTEREC * V_FATOR) * RATAJU.VRPERATTPAJR)/100, 2), AJUSTE.DTAJUSTEREC, LPAD(TO_CHAR(V_RATSEQ),5,'0'));

                     V_CDCENTCUST := RATAJU.CDCENTCUST;
                     V_RATSEQ := V_RATSEQ + 1;
                  END LOOP;

                  IF V_ENTROULOOP = 'S' THEN
                     /* VERIFICA SE O VALOR TOTAL RATEADO E IGUAL AO VEALOR DO AJUSTE, CASO NAO SEJA, E FEITO
                        O RATEIO PARA A ULTIMA FILIAL E CENTRO DE CUSTO */
                     IF V_VRRATEIO <> (AJUSTE.VRAJUSTEREC * V_FATOR) THEN
                        V_VRRATEIO := (AJUSTE.VRAJUSTEREC * V_FATOR) - V_VRRATEIO;
                        UPDATE RATECTBTEMP
                           SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRRATEIO
                         WHERE CDEMPRESA     = AJUSTE.CDEMPRESA
                           AND NRLANCCTBTEMP = V_NRLANCTEMP
                           AND NRSEQCTBTEMP  = '00002'
                           AND CDFILIAL      = V_CDFILIAL
                           AND CDCENTCUST    = V_CDCENTCUST;
                     END IF;
                  END IF;

                  IF V_ENTROULOOP = 'N' THEN
                     V_CDCENTCUST := BUSCA_CCUSTO(AJUSTE.CDFILIEMIT, AJUSTE.CDEMPRESA);
                     /* CASO NAO TENHA RATEIO CADASTRADO NA TELA DE PARAMETROS PARA CENTRO DE CUSTO, E FEITO O RATEIO
                        PARA A FILIAL DE EMISSAO DA CONTA DO AJUSTE */
                     INSERT INTO RATECTBTEMP
                       (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                     VALUES
                        (AJUSTE.CDEMPRESA, V_NRLANCTEMP, '00002', AJUSTE.CDFILIEMIT, V_CDCENTCUST,
                        ROUND(AJUSTE.VRAJUSTEREC * V_FATOR, 2), AJUSTE.DTAJUSTEREC, LPAD(TO_CHAR(V_RATSEQ),5,'0'));
                  END IF;
               END IF;
            END IF;
         END IF;
         /*VERIFICACAO DE ERROS NAS PARTIDAS E NO LANCAMENTO CONTABIL*/
         VERIFICA_ERRO_CTB(V_NRLANCTEMP, AJUSTE.CDEMPRESA);
         BEGIN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM ERROCTBTEMP
             WHERE NRLANCCTBTEMP = V_NRLANCTEMP
               AND CDEMPRESA = AJUSTE.CDEMPRESA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;
         /* CASO NAO TENHA GERADO ERRO NA ROTINA DE CONTABILIZACAO, O NUMERO DE LANCAMENTO E GRAVADO NO AJUSTE. */
         IF V_COUNT = 0 THEN
            UPDATE AJCTRECEBER
               SET NRLCTBAJREC = V_NRLANCTEMP,
                   CDECTBAJREC = AJUSTE.CDEMPRESA
             WHERE CDFILIAL     = P_CDFILIAL
               AND NRLANCTONF   = P_NRLANCTONF
               AND NRSEQVENREC  = P_NRSEQVENREC
               AND NRPARCELAREC = P_NRPARCELAREC
               AND DTAJUSTEREC  = P_DTAJUSTEREC
               AND CDAJUCTREC   = P_CDAJUCTREC;
         END IF;

         P_NRLANCCTB := V_NRLANCTEMP;
         /* TERMINO DAS PARTIDAS DO LANCAMENTO CONTABIL*/
          /* GRAVA O LANCAMENTO TEMPORARIO SE NAO CONTER ERRO NA LANCCONT E LANCCUSTO, APOS GRAVAR IRA APAGAR O LANCAMENTO TEMPORARIO */
         GRAVA_LANC_CTB(V_NRLANCTEMP, AJUSTE.CDEMPRESA);
      END LOOP;
   END IF;
END;
/