CREATE OR REPLACE
PROCEDURE CTB_PAG_LANC(
   P_CDFILIAL     IN FILIAL.CDFILIAL%TYPE,
   P_NRLANCTONF   IN NOTAFISCAL.NRLANCTONF%TYPE,
   P_NRPARCELAPAG IN CONTAPAGAR.NRPARCELAPAG%TYPE,
   P_NRSEQVENPAG  IN CONTAPAGAR.NRSEQVENPAG%TYPE,
   P_DTAJUSTEPAG  IN AJCTPAGAR.DTAJUSTEPAG%TYPE,
   P_CDAJUCTPAG   IN AJCTPAGAR.CDAJUCTPAG%TYPE,
   P_IDTIPO       IN VARCHAR2,
   P_NRLANCCTB    OUT LANCCONT.NRLANCCONT%TYPE)
AS
   V_NRLANCTEMP  NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_CDFORNECEDAUX NOTAFISCAL.CDFORNECED%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 INT;
   V_CONTRAT    VARCHAR2(01);
   V_FATOR      INTEGER;
   V_ENTROULOOP VARCHAR2(01);
   V_PERCENTUAL LANCCONT.VRLANCAMENT%TYPE;
   V_EXISTERATEIO VARCHAR2(01);
   V_NRSEQCTB LANCCONT.NRSEQLANC%TYPE;
   V_TOTAL LANCCONT.VRLANCAMENT%TYPE;
   V_INPARTIDA INT;
   V_INCOUNT INT;
   V_CDTPCTPAGRA TIPOCTPAGAR.CDTPCTPAGAR%TYPE;
   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 MAX(CDCENTCUST)
          INTO V_CDCENTCUST
          FROM RATCTPAGAR
         WHERE CDFILIAL     =  P_CDFILIAL
           AND NRLANCTONF   =  P_NRLANCTONF
           AND NRSEQVENPAG  =  P_NRSEQVENPAG
           AND NRPARCELAPAG =  P_NRPARCELAPAG;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
         V_CDCENTCUST := NULL;
      END;
      IF V_CDCENTCUST IS NULL THEN
         BEGIN
            SELECT MAX(CDCENTCUST)
              INTO V_CDCENTCUST
              FROM RATTPCTP
             WHERE CDTPCTPAGAR = V_CDTPCTPAGRA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
            V_CDCENTCUST := NULL;
         END;
      END IF;
      IF V_CDCENTCUST IS NULL THEN
         BEGIN
            SELECT CDCENTCUST
              INTO V_CDCENTCUST
              FROM FILIAL
             WHERE CDFILIAL = P_CDFILIAL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCENTCUST := NULL;
         END;
      END IF;
      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.CDTPCTPAGAR, NF.CDFILIRECE, NF.CDFORNECED,
                             NF.NRNOTAFISC, NF.DTENTRSAID, CR.VRORIGPAG, NF.IDSTATUS,
                             TP.CDHISTPADR, TP.CDCONTCTBL, CR.VRATUAPAG, NF.VRNOTAFISC,
                             NF.NRLANCTBDOC
                        FROM CONTAPAGAR CR, NOTAFISCAL NF, TIPOCTPAGAR TP, HISTPADR H
                       WHERE CR.CDFILIAL = P_CDFILIAL
                         AND CR.NRLANCTONF = P_NRLANCTONF
                         AND CR.NRSEQVENPAG = P_NRSEQVENPAG
                         AND CR.NRPARCELAPAG = P_NRPARCELAPAG
                         AND CR.CDFILIAL = NF.CDFILIAL
                         AND CR.NRLANCTONF = NF.NRLANCTONF
                         AND CR.CDTPCTPAGAR = TP.CDTPCTPAGAR
                         AND TP.IDCTBLCTPAG = 'S'
                         AND TP.CDHISTPADR = H.CDHISTPADR(+)
                         AND NF.IDSISTEMA IN ('PAG', 'ITG')) LOOP
         /* VERIFICA SE A EMPRESA RESPONSVEL PELA CONTA UTILIZA A  GEREO DE RATEIO DO LANAMENTO CONTBIL  N- NO S-SIM
         VERIFICA SE OS VALORES DE PARTIDAS IRO ACUMULAR, CASO A CONTA CONTBIL 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.DTENTRSAID >= DTINTCTBPAG;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;
         IF V_COUNT > 0 THEN
            IF (C_CONTA.IDSTATUS = 'A') THEN
               V_NRLANCTEMP := C_CONTA.NRLANCTBDOC;
               IF V_NRLANCTEMP IS NOT NULL THEN
                  /* DELETA OS RATEIOS DO LANAMENTO CONTBIL */
                  DELETE
                    FROM LANCCCUSTO
                   WHERE NRLANCCONT = V_NRLANCTEMP
                     AND CDEMPRESA  = C_CONTA.CDEMPRESA;
                  /* DELETA AS PARTIDAS DO LANAMENTO CONTBIL */
                  DELETE
                    FROM LANCCONT
                   WHERE NRLANCCONT = V_NRLANCTEMP
                     AND CDEMPRESA  = C_CONTA.CDEMPRESA;
               END IF;
               /* DELETA TODOS OS REGISTROS TEMPORRIOS PARA ESSE LANAMENTO */
               DELETE FROM LANCCTBTEMP
                WHERE NRLANCCTBTEMP = V_NRLANCTEMP
                  AND CDEMPRESA     = C_CONTA.CDEMPRESA;
               DELETE FROM RATECTBTEMP
                WHERE NRLANCCTBTEMP = V_NRLANCTEMP
                  AND CDEMPRESA     = C_CONTA.CDEMPRESA;
               /* CASO A VARIVEL QUE RECEBE O NMERO DO LANAMENTO CONTBIL SEJA NULA,  PORQUE O LANAMENTO CONTBIL  NOVO. */
               IF V_NRLANCTEMP IS NULL THEN
                  /* PEGA UM NOVO NMERO DE LANAMENTO CONTBIL, CASO O LANAMENTO NO PAG SEJA NOVO */
                  NOVO_CODIGO_NT('LANCCONTABIL' || C_CONTA.CDEMPRESA || TO_CHAR(C_CONTA.DTENTRSAID,'YYYYMM'), V_NRLANCTEMP);
                  V_NRLANCTEMP := TO_CHAR(C_CONTA.DTENTRSAID,'YYYYMM')||SUBSTR(V_NRLANCTEMP, 15, 6);
               END IF;
               /* BUSCA HISTORICO PADRAO DE INTEGRAO DO PAG*/
               BEGIN
                  SELECT HI.CDHISTPADR
                    INTO V_CDHISTPADR
                    FROM HISTINTEGRA HI, HISTPADR HP
                   WHERE HI.CDHISTPADR = HP.CDHISTPADR
                     AND HI.CDOPERACAO = 'CTAPAG';
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN BEGIN
                     V_CDHISTPADR := NULL;
                  END;
               END;
               /* VERIFICA SE EXISTE HISTORIO CADASTRADO NO TIPO DE CONTA, CASO NO EXISTA PEGA DO HISTORICO DE INTEGRAO PAG */
               IF C_CONTA.CDHISTPADR IS NOT NULL THEN
                  V_CDHISTPADR := C_CONTA.CDHISTPADR;
               END IF;
               /* FORMATA A DESCRIO DO HISTRICO PADRO BUSCADO, DO TIPO DE CONTA OU DE INTEGRAO */
               V_DSHISTLANC := CTB_HIST_PAG(V_CDHISTPADR, P_CDFILIAL, P_NRLANCTONF, P_NRSEQVENPAG, P_NRPARCELAPAG, P_CDAJUCTPAG);
               /* CREDITA NA CONTA CONTABIL DE FORNECEDOR */
               V_CDCONTCTBL := CTB_CCFORNECEDOR(C_CONTA.CDFORNECED, C_CONTA.CDFILIRECE, C_CONTA.CDEMPRESA);
               BUSCA_TPCOMERCIAL(V_CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);
               /*VERIFICA O TIPO DE CDIGO COMERCIAL, CASO SEJA DIFERENTE DE FORNECEDOR,  PASSADO NULO PARA A PARTIDA.
               O N  TRATADO NA HORA DE PASSAR PARA A LANCCONT NA PROCEDURE GRAVA_LANC_CTB */
               V_CDFORNECEDAUX := C_CONTA.CDFORNECED;
               IF V_IDTIPOCOME <> 'F' THEN
                  V_CDFORNECEDAUX := NULL;
               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.DTENTRSAID, C_CONTA.VRNOTAFISC, V_IDTIPOCOME, V_CDFORNECEDAUX, 'PAG');
               /* VERIFICA SE A EMPRESA GERA O RATEIO CONTBIL. */
               IF V_CONTRAT = 'S' THEN
                  /* VERIFICA SE A CONTA NO  S OFICIAL*/
                  IF V_IDCONTCCUS <> 'O' THEN
                     V_CDCENTCUST := BUSCA_CCUSTO(C_CONTA.CDFILIRECE, C_CONTA.CDEMPRESA);
                     INSERT INTO RATECTBTEMP
                        (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                     VALUES
                        (C_CONTA.CDEMPRESA, V_NRLANCTEMP, '00001', C_CONTA.CDFILIRECE, V_CDCENTCUST, C_CONTA.VRNOTAFISC, C_CONTA.DTENTRSAID, '00001');
                  END IF;
               END IF;
               /*-------- ABAIXO IR FAZER AS PARTIDAS DE DBITO PARA O TIPO DE CONTA --------*/
               V_CDFORNECEDAUX := C_CONTA.CDFORNECED;
               IF V_IDTIPOCOME <> 'F' THEN
                  V_CDFORNECEDAUX := NULL;
               END IF;
               /* A FUNCAO DE BUSCAR CENTRO DE CUSTO FOI UTILIZADA, NESTE PONTO, PORQUE
                  SE A CONTA FOI RATEADA PARA MAIS DE UMA FILIAL E CENTRO DE CUSTO DIFERENTES
                  DOS DE ORIGEM, O SISTEMA TEM QUE BUSCAR AS CONTAS CONTBEIS PARA DIFERENTES FILIAIS
                  QUE TENHAM CONTAS CONTBEIS CADASTRADAS PARA O TIPO DE CONTA */
               V_CDCENTCUST := BUSCA_CCUSTO(C_CONTA.CDFILIRECE, C_CONTA.CDEMPRESA);
               V_COUNT := 0;
               BEGIN
                  SELECT COUNT(*)
                    INTO V_COUNT
                    FROM RATCTPAGAR
                   WHERE CDFILIAL = P_CDFILIAL
                     AND NRLANCTONF = P_NRLANCTONF
                     AND NRSEQVENPAG = P_NRSEQVENPAG
                     AND NRPARCELAPAG = P_NRPARCELAPAG
                     AND ((CDFIRATCTPAG <> C_CONTA.CDFILIRECE) OR
                          (CDCENTCUST <> NVL(V_CDCENTCUST,'T')));
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_COUNT := 0;
               END;
               IF V_COUNT <> 0 THEN
                  V_EXISTERATEIO := 'S';
               ELSE
                  V_EXISTERATEIO := 'N';
               END IF;
               IF V_EXISTERATEIO = 'N' THEN
                  V_CDCONTCTBL := CTB_CCTBL_TIPOCONTAFIL(C_CONTA.CDTPCTPAGAR, C_CONTA.CDFILIRECE);
                  BUSCA_TPCOMERCIAL(V_CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);
                  IF V_IDTIPOCOME <> 'F' THEN
                     V_CDFORNECEDAUX := NULL;
                  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', V_CDCONTCTBL, V_CDHISTPADR,
                      V_DSHISTLANC, C_CONTA.DTENTRSAID, C_CONTA.VRNOTAFISC * -1, V_IDTIPOCOME, V_CDFORNECEDAUX, 'PAG');
                  IF V_CONTRAT = 'S' THEN
                     /* VERIFICA SE A CONTA CONTBIL DE DBITO NO  S OFICIAL */
                     IF V_IDCONTCCUS <> 'O' THEN
                        /* FAZ O SOMATRIO DOS VALORES RATEADOS PARA VER SE DA DIFERENA DE ARREDONDAMENTO NO FINAL */
                         V_CDCENTCUST := BUSCA_CCUSTO(C_CONTA.CDFILIRECE, C_CONTA.CDEMPRESA);
                         INSERT INTO RATECTBTEMP
                            (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                         VALUES
                            (C_CONTA.CDEMPRESA, V_NRLANCTEMP, '00002', C_CONTA.CDFILIRECE, V_CDCENTCUST,
                             C_CONTA.VRNOTAFISC * -1, C_CONTA.DTENTRSAID, '00002');
                         V_CDFILIAL := C_CONTA.CDFILIRECE;
                     END IF;
                  END IF;
               ELSE
                  V_TOTAL := C_CONTA.VRNOTAFISC;
                  V_SEQUENCIAL := 1;
                  V_INPARTIDA := 1;
                  V_INCOUNT := 1;
                  /* TRAZ OS RATEIOS DA CONTA PARA QUE SEJA POSSVEL CONTABILIZAR PARA AS CONTAS CONTBEIS DIFERENTES */
                  FOR C_RATCTPAGAR IN
                     (SELECT CDCENTCUST, CDFIRATCTPAG, VRRATCCCTPAG, COUNT(*) OVER (PARTITION BY CDFILIAL, NRLANCTONF, NRPARCELAPAG, NRSEQVENPAG) RECORDCOUNT
                        FROM RATCTPAGAR
                       WHERE CDFILIAL = P_CDFILIAL
                         AND NRLANCTONF = P_NRLANCTONF
                         AND NRSEQVENPAG = P_NRSEQVENPAG
                         AND NRPARCELAPAG = P_NRPARCELAPAG
                       ORDER BY CDFIRATCTPAG, CDCENTCUST)LOOP
                     /* BUSCA A CONTA CONTBIL DE TIPO DE CONTA POR FILIAL DE RATEIO. CASO NO TENHA PARAMETRIZADO,
                         BUSCADO A CONTA CONTBIL PARA O TIPO DE CONTA DE FORMA GENRICA. */
                     V_CDCONTCTBL := CTB_CCTBL_TIPOCONTAFIL(C_CONTA.CDTPCTPAGAR, C_RATCTPAGAR.CDFIRATCTPAG);
                     /* FUNCAO QUE BUSCA O TIPO COMERCIAL E GERENCIAL DA CONTA CONTBIL */
                     BUSCA_TPCOMERCIAL(V_CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);
                     V_CDFORNECEDAUX := C_CONTA.CDFORNECED;
                     IF V_IDTIPOCOME <> 'F' THEN
                        V_CDFORNECEDAUX := NULL;
                     END IF;
                     /* VERIFICA SE J EXISTE UMA PARTIDA PARA A CONTA CONTBIL PARAMETRIZADA. */
                     V_COUNT := 0;
                     BEGIN
                        SELECT COUNT(*)
                          INTO V_COUNT
                          FROM LANCCTBTEMP
                         WHERE CDCONTCTBL = V_CDCONTCTBL
                           AND CDEMPRESA = C_CONTA.CDEMPRESA
                           AND NRLANCCTBTEMP = V_NRLANCTEMP;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_COUNT := 0;
                     END;
                     /*  PEGO O VALOR DA PARTIDA/RATEIO A SER REALIZADO */
                     V_PERCENTUAL := ROUND((C_RATCTPAGAR.VRRATCCCTPAG * 100) / C_CONTA.VRATUAPAG, 2);
                     V_PERCENTUAL := ROUND((V_PERCENTUAL * C_CONTA.VRNOTAFISC) / 100, 2);
                     /* FAZ O SOMATRIO DOS VALORES RATEADOS, PARA QUE NO FINAL DA ROTINA POSSA SER
                        FEITO O ARREDONDAMENTO DA CONTABILIZO. */
                     V_TOTAL := ROUND(V_TOTAL - V_PERCENTUAL, 2);
                     IF V_INCOUNT = C_RATCTPAGAR.RECORDCOUNT THEN
                        V_PERCENTUAL := V_PERCENTUAL + V_TOTAL;
                     END IF;
                     IF V_COUNT = 0 THEN
                        /* CASO NO EXISTA UMA PARTIDA PARA A CONTA CONTBIL PARAMETRIZADA,
                            BUSCADO O MAIOR SEQUENCIAL DAS PARTIDAS, PARA QUE SEJA POSSVEL
                           REALIZAR UMA NOVA. */
                        BEGIN
                           SELECT TO_NUMBER(MAX(NRSEQCTBTEMP))
                             INTO V_SEQUENCIAL
                             FROM LANCCTBTEMP
                            WHERE CDEMPRESA = C_CONTA.CDEMPRESA
                              AND NRLANCCTBTEMP = V_NRLANCTEMP;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_SEQUENCIAL := NULL;
                        END;
                        /* SOMA 1 NO SEQUENCIAL DA PARTIDA */
                        V_SEQUENCIAL := NVL(V_INPARTIDA, 1) + 1;
                        V_NRSEQCTB := LPAD(TO_CHAR(V_SEQUENCIAL),5,'0');
                        V_INPARTIDA := V_INPARTIDA + 1;
                        /* REALIZA A PARTIDA PARA A CONTA CONTBIL PARAMETRIZADA PARA A FILIAL CONTIDA NO RATEIO. */
                        INSERT INTO LANCCTBTEMP
                           (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP, CDCONTCTBL, CDHISTPADR,
                            DSHISTCTB, DTLANCCTBTEMP, VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
                        VALUES
                           (C_CONTA.CDEMPRESA, V_NRLANCTEMP, C_CONTA.NRNOTAFISC, V_NRSEQCTB, V_CDCONTCTBL, V_CDHISTPADR,
                            V_DSHISTLANC, C_CONTA.DTENTRSAID, V_PERCENTUAL * -1, V_IDTIPOCOME, V_CDFORNECEDAUX, 'PAG');
                     ELSE
                        /* CASO J EXISTA UMA PARTIDA PARA A CONTA CONTBIL PARAMETRIZADA,  BUSCADO O SEQUENCIAL
                           DESTA PARTIDA PARA ATUALZAR O VALOR DA MESMA. */
                        BEGIN
                           SELECT NRSEQCTBTEMP
                             INTO V_NRSEQCTB
                             FROM LANCCTBTEMP
                            WHERE CDEMPRESA = C_CONTA.CDEMPRESA
                              AND NRLANCCTBTEMP = V_NRLANCTEMP
                              AND CDCONTCTBL = V_CDCONTCTBL;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_NRSEQCTB := NULL;
                        END;
                        /* ATUALIZANDO O VALOR DA PARTIDA */
                        UPDATE LANCCTBTEMP
                           SET VRLANCCTBTEMP = VRLANCCTBTEMP + (V_PERCENTUAL * -1)
                         WHERE NRSEQCTBTEMP = V_NRSEQCTB
                           AND CDEMPRESA = C_CONTA.CDEMPRESA
                           AND NRLANCCTBTEMP = V_NRLANCTEMP;
                     END IF;
                     /* VERIFICA SE O PARAMETRO DE CONTROLAR CENTRO DE CUSTO EST MARCADO*/
                     IF V_CONTRAT = 'S' THEN
                        /* VERIFICA SE A CONTA CONTBIL DE DBITO NO  S OFICIAL */
                        IF V_IDCONTCCUS <> 'O' THEN
                           /* VERIFICA SE J EXISTE ALGUM RATEIO PARA A CONTA CONTBIL PARAMETRIZADA.
                              COM O MESMO CENTRO DE CUSTO E FILIAL DO RATEIO. */
                           BEGIN
                              SELECT COUNT(*)
                                INTO V_COUNT
                                FROM RATECTBTEMP
                               WHERE NRSEQCTBTEMP = V_NRSEQCTB
                                 AND CDEMPRESA = C_CONTA.CDEMPRESA
                                 AND NRLANCCTBTEMP = V_NRLANCTEMP
                                 AND CDFILIAL = C_RATCTPAGAR.CDFIRATCTPAG
                                 AND CDCENTCUST = C_RATCTPAGAR.CDCENTCUST;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_COUNT := 0;
                           END;
                           /* CASO NO EXISTA,  INSERIDO UM NOVO RATEIO NA PARTIDA */
                           IF V_COUNT = 0 THEN
                              INSERT INTO RATECTBTEMP
                                  (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                               VALUES
                                  (C_CONTA.CDEMPRESA, V_NRLANCTEMP, V_NRSEQCTB, C_RATCTPAGAR.CDFIRATCTPAG, C_RATCTPAGAR.CDCENTCUST,
                                   V_PERCENTUAL * -1, C_CONTA.DTENTRSAID, '00001');
                           ELSE
                              /* CASO EXISTA, O VALOR PARA A FILIAL E CENTRO DE CUSTO  ATUALIZADO. */
                              UPDATE RATECTBTEMP
                                 SET VRRATECTBTEMP = VRRATECTBTEMP + (V_PERCENTUAL * -1)
                               WHERE CDEMPRESA     = C_CONTA.CDEMPRESA
                                 AND NRLANCCTBTEMP = V_NRLANCTEMP
                                 AND NRSEQCTBTEMP  = V_NRSEQCTB
                                 AND CDFILIAL      = C_RATCTPAGAR.CDFIRATCTPAG
                                 AND CDCENTCUST    = C_RATCTPAGAR.CDCENTCUST;
                           END IF;
                        END IF;
                     END IF;
                     V_INCOUNT := V_INCOUNT + 1;
                     V_CDFILIAL := C_RATCTPAGAR.CDFIRATCTPAG;
                     V_CDCENTCUST := C_RATCTPAGAR.CDCENTCUST;
                  END LOOP;
               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 LANAMENTO NO TER ERROS,  GRAVADO O NMERO DE LANAMENTO CONTBIL 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;
               /* TRMINO DAS PARTIDAS DO LANCAMENTO CONTABIL*/
                /* GRAVA O LANAMENTO TEMPORRIO SE NO CONTER ERRO NA LANCCONT E LANCCUSTO, APS GRAVAR IR APAGAR O LANCAMENTO TEMPORRIO */
               GRAVA_LANC_CTB(V_NRLANCTEMP, C_CONTA.CDEMPRESA);
            END IF;                        
         END IF;
      END LOOP;
   ELSIF P_IDTIPO = 'A' THEN
      /*----------------------------------------------------------------------*/
      /* Contabilizao de ajuste da aba ajuste da tela de contas a pagar     */
      /*----------------------------------------------------------------------*/
      /* FILTRA O AJUSTE QUE ACABOU DE SER INSERIDO NA TELA PARA CONTABILIZAR */
      FOR AJUSTE IN
      (SELECT A.CDFILIAL, A.NRLANCTONF, A.NRSEQVENPAG, A.NRPARCELAPAG,
              A.DTAJUSTEPAG, A.CDAJUCTPAG, T.DSAJUCTPAG, T.CDHISTPADR,
              ROUND(A.VRAJUSTEPAG, 2) VRAJUSTEPAG, T.IDAJUCTPAG, T.CDCONTCTBL,
              NF.CDFORNECED, NF.CDFILIRECE, A.NRLCTBAJPAG, NF.NRNOTAFISC,
              NF.CDEMPRESA
        FROM AJCTPAGAR A, TIPOAJPAGAR T, NOTAFISCAL NF, HISTPADR H
       WHERE A.CDFILIAL = P_CDFILIAL
         AND A.NRLANCTONF = P_NRLANCTONF
         AND A.NRSEQVENPAG = P_NRSEQVENPAG
         AND A.NRPARCELAPAG = P_NRPARCELAPAG
         AND A.DTAJUSTEPAG = P_DTAJUSTEPAG
         AND A.CDAJUCTPAG = P_CDAJUCTPAG
         AND A.CDAJUCTPAG = T.CDAJUCTPAG
         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.CDAJUCTPAG) LOOP
	    /* VERIFICA SE A EMPRESA RESPONSVEL PELA CONTA UTILIZA A  GEREO DE RATEIO DO LANAMENTO CONTBIL  N- NO S-SIM
         VERIFICA SE OS VALORES DE PARTIDAS IRO ACUMULAR, CASO A CONTA CONTBIL SEJA A MESMA*/
         SELECT IDCONTGERE
           INTO V_CONTRAT
           FROM CONTOPECTBL
          WHERE CDEMPRESA = AJUSTE.CDEMPRESA;
         BEGIN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM PARAMCTBL
             WHERE AJUSTE.DTAJUSTEPAG >= DTINTCTBPAG;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;
         V_NRLANCTEMP := AJUSTE.NRLCTBAJPAG;
         IF V_NRLANCTEMP IS NOT NULL THEN
            /* DELETA OS RATEIOS DO LANAMENTO CONTBIL */
            DELETE
              FROM LANCCCUSTO
             WHERE NRLANCCONT = V_NRLANCTEMP
               AND CDEMPRESA  = AJUSTE.CDEMPRESA;
            /* DELETA AS PARTIDAS DO LANAMENTO CONTBIL */
            DELETE
              FROM LANCCONT
             WHERE NRLANCCONT = V_NRLANCTEMP
               AND CDEMPRESA  = AJUSTE.CDEMPRESA;
            /* DELETA TODOS OS REGISTROS TEMPORRIOS PARA ESSE LANAMENTO */
            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 VARIVEL QUE RECEBE O NMERO DO LANAMENTO CONTBIL SEJA NULA,  PORQUE O LANAMENTO CONTBIL  NOVO. */
         IF V_NRLANCTEMP IS NULL THEN
            /* PEGA UM NOVO NMERO DE LANAMENTO CONTBIL, CASO O AJUSTE NO PAG SEJA NOVO */
            NOVO_CODIGO_NT('LANCCONTABIL' || AJUSTE.CDEMPRESA || TO_CHAR(P_DTAJUSTEPAG,'YYYYMM'), V_NRLANCTEMP);
            V_NRLANCTEMP := TO_CHAR(P_DTAJUSTEPAG,'YYYYMM')||SUBSTR(V_NRLANCTEMP, 15, 6);
         END IF;
         /* VERIFICA SE  UM AJUSTE DE DESCONTO OU ACRSCIMO */
         IF AJUSTE.IDAJUCTPAG = 'D' THEN
            V_FATOR :=  1;
         ELSE
            V_FATOR := -1;
         END IF;
         V_CDHISTPADR := AJUSTE.CDHISTPADR;
         V_DSHISTLANC := CTB_HIST_PAG(V_CDHISTPADR, P_CDFILIAL, P_NRLANCTONF, P_NRSEQVENPAG, P_NRPARCELAPAG, P_CDAJUCTPAG);
         V_CDCONTCTBL := CTB_CCFORNECEDOR(AJUSTE.CDFORNECED, AJUSTE.CDFILIRECE, AJUSTE.CDEMPRESA);
         BUSCA_TPCOMERCIAL(V_CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);
         /* GUARDA O CDIGO DE FORNECEDOR EM UMA VARIVEL PARA QUE SEJA POSSVEL RECUPER-LO */
         V_CDFORNECEDAUX := AJUSTE.CDFORNECED;
         /* CASO A CONTA CONTBIL NO SEJA DO TIPO FORNECEDOR, A PARTIDA SER SEM CDIGO COMERCIAL */
         IF V_IDTIPOCOME <> 'F' THEN
            V_CDFORNECEDAUX := 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, '00001', V_CDCONTCTBL, V_CDHISTPADR,
             V_DSHISTLANC, AJUSTE.DTAJUSTEPAG, AJUSTE.VRAJUSTEPAG * -1 * V_FATOR, V_IDTIPOCOME, V_CDFORNECEDAUX, 'PAG');
         /* VERIFICA SE A EMPRESA CONTROLA O RATEIO CONTBIL */
         IF V_CONTRAT = 'S' THEN
            /* VERIFICA SE A CONTA CONTBIL NO  S OFICIAL */
            IF V_IDCONTCCUS <> 'O' THEN
               V_CDCENTCUST := BUSCA_CCUSTO(AJUSTE.CDFILIRECE, AJUSTE.CDEMPRESA);
               INSERT INTO RATECTBTEMP
                  (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
               VALUES
                  (AJUSTE.CDEMPRESA, V_NRLANCTEMP, '00001', AJUSTE.CDFILIRECE, V_CDCENTCUST, AJUSTE.VRAJUSTEPAG * V_FATOR * -1, AJUSTE.DTAJUSTEPAG, '00001');
            END IF;
         END IF;
         /* CREDITA NO TIPO DE AJUSTE */
         BUSCA_TPCOMERCIAL(AJUSTE.CDCONTCTBL, V_IDTIPOCOME, V_IDCONTCCUS);
         /* GUARDA O CDIGO DO FORNECEDOR */
         V_CDFORNECEDAUX := AJUSTE.CDFORNECED;
         /* SE A CONTA CONTBIL FOR DIFERENTE DE FORNECEDOR,  FEITA A PARTIDA SEM CDIGO COMERCIAL */
         IF V_IDTIPOCOME <> 'F' THEN
            V_CDFORNECEDAUX  := 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, '00002', AJUSTE.CDCONTCTBL, V_CDHISTPADR,
             V_DSHISTLANC, AJUSTE.DTAJUSTEPAG, AJUSTE.VRAJUSTEPAG * V_FATOR, V_IDTIPOCOME, V_CDFORNECEDAUX, 'PAG');
         /* VERIFICA SE A EMPRESA CONTROLA RATEIO CONTBIL */
         IF V_CONTRAT = 'S' THEN
            /* SE A CONTA CONTBIL FOR DIFERENTE DE S OFICIAL, SO FEITOS OS RATEIOS NECESSRIOS */
            IF V_IDCONTCCUS <> 'O' THEN
               V_ENTROULOOP := 'N';
               V_VRRATEIO := 0;
               /* PEGA OS CENTROS DE CUSTOSM FILIALS E PERCENTUAIS CADASTRADOS NA TELA */
               FOR RATAJU IN
                  (SELECT CDCENTCUST, CDFIRATTPAJP, CDFILIAL, VRPERATTPAJP
                     FROM RATTPAJP
                    WHERE CDAJUCTPAG = P_CDAJUCTPAG) LOOP
                  V_ENTROULOOP := 'S';
                  /* FAZ O SOMATRIO DOS RATEIOS DE ACORDO COM OS PERCENTUAIS INFORMADOS NA TELA
                     PARA VERIFICAR SE EXISTE DIFERENA DE ARREDONDAMENTO POSTERIORMENTE */
                  V_VRRATEIO := V_VRRATEIO + ROUND(((AJUSTE.VRAJUSTEPAG * V_FATOR)* RATAJU.VRPERATTPAJP) /100, 2);
                  IF RATAJU.CDFIRATTPAJP = '----' THEN
                     V_CDFILIAL := AJUSTE.CDFILIRECE;
                  ELSE
                     V_CDFILIAL := RATAJU.CDFIRATTPAJP;
                  END IF;
                  /* CASO TENHA FILIAL CADASTRADA NA TELA,  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.VRAJUSTEPAG * V_FATOR) * RATAJU.VRPERATTPAJP)/100, 2), AJUSTE.DTAJUSTEPAG, '00001');
                  V_CDCENTCUST := RATAJU.CDCENTCUST;
               END LOOP;
               IF V_ENTROULOOP = 'N' THEN
                  V_CDCENTCUST := BUSCA_CCUSTO(AJUSTE.CDFILIRECE, AJUSTE.CDEMPRESA);
                  /* CASO NO TENHA RATEIO CADASTRADO NA TELA DE PARAMETROS PARA CENTRO DE CUSTO,  FEITO O RATEIO
                     PARA A FILIAL DE EMISSO DA CONTA DO AJUSTE */
                  INSERT INTO RATECTBTEMP
                    (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                  VALUES
                     (AJUSTE.CDEMPRESA, V_NRLANCTEMP, '00002', AJUSTE.CDFILIRECE, V_CDCENTCUST,
                     ROUND(AJUSTE.VRAJUSTEPAG * V_FATOR, 2), AJUSTE.DTAJUSTEPAG, '00001');
               END IF;
               IF V_ENTROULOOP = 'S' THEN
                  /* VERIFICA SE O VALOR TOTAL RATEADO  IGUAL AO VEALOR DO AJUSTE, CASO NO SEJA,  FEITO
                     O RATEIO PARA A LTIMA FILIAL E CENTRO DE CUSTO */
                  IF V_VRRATEIO <> (AJUSTE.VRAJUSTEPAG * V_FATOR) THEN
                     V_VRRATEIO := (AJUSTE.VRAJUSTEPAG * 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;
            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 NO TENHA GERADO ERRO NA ROTINA DE CONTABILIZAO, O NMERO DE LANAMENTO  GRAVADO NO AJUSTE. */
         IF V_COUNT = 0 THEN
            UPDATE AJCTPAGAR
               SET NRLCTBAJPAG = V_NRLANCTEMP,
                   CDECTBAJPAG = AJUSTE.CDEMPRESA
             WHERE CDFILIAL     = P_CDFILIAL
               AND NRLANCTONF   = P_NRLANCTONF
               AND NRSEQVENPAG  = P_NRSEQVENPAG
               AND NRPARCELAPAG = P_NRPARCELAPAG
               AND DTAJUSTEPAG  = P_DTAJUSTEPAG
               AND CDAJUCTPAG   = P_CDAJUCTPAG;
         END IF;
         P_NRLANCCTB := V_NRLANCTEMP;
         /* TRMINO DAS PARTIDAS DO LANCAMENTO CONTABIL*/
          /* GRAVA O LANAMENTO TEMPORRIO SE NO CONTER ERRO NA LANCCONT E LANCCUSTO, APS GRAVAR IR APAGAR O LANCAMENTO TEMPORRIO */
         GRAVA_LANC_CTB(V_NRLANCTEMP, AJUSTE.CDEMPRESA);
      END LOOP;
   END IF;
END;