CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_B11U FOR TBNFS_PARCELAMENTO
ACTIVE BEFORE UPDATE POSITION 8
AS
DECLARE VARIABLE OPERACAO           NUMERIC(18,2);
DECLARE VARIABLE TIPO_LANC          VARCHAR(3);
DECLARE VARIABLE CONTA_CREDITO      VARCHAR(50);
DECLARE VARIABLE CONTA_DEBITO       VARCHAR(50);
DECLARE VARIABLE DESC_CONTA_CREDITO VARCHAR(200);
DECLARE VARIABLE DESC_CONTA_DEBITO  VARCHAR(200);
DECLARE VARIABLE HISTORICO_CONTABIL VARCHAR(250);
DECLARE VARIABLE VALOR_SALDO        NUMERIC(15,8);
DECLARE VARIABLE MOVCONTMESTRE_ID   INTEGER;
DECLARE VARIABLE MOVCONTABIL_ID     INTEGER;
DECLARE VARIABLE CONTROLE           INTEGER;
BEGIN
  IF(NEW.CONTA_RECEBER_BANCO <> OLD.CONTA_RECEBER_BANCO OR NEW.CONTA_RECEBER_OPERACAO <> OLD.CONTA_RECEBER_OPERACAO) THEN
  BEGIN
     UPDATE TBCAIXABANCO_LANCAMENTO_REG
        SET OPERACAO_CODIGO             = NEW.CONTA_RECEBER_OPERACAO,
            CAIXABANCO_CODIGO           = NEW.CONTA_RECEBER_BANCO
        WHERE ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
          AND EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
          AND DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
          AND NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
          AND NFS_CONTROLE              = OLD.NFS_CONTROLE
          AND OPERACAO_CODIGO           = OLD.CONTA_RECEBER_OPERACAO
          AND CAIXABANCO_CODIGO         = OLD.CONTA_RECEBER_BANCO
          AND REGISTRO_MESTRE           = 1 ;
  END

  IF((OLD.PERCENTUAL_TAXA <> NEW.PERCENTUAL_TAXA OR OLD.PERCENTUAL_TAXA IS NULL AND NEW.PERCENTUAL_TAXA > 0)) THEN
  BEGIN
     MOVCONTABIL_ID      = 0;
     MOVCONTMESTRE_ID    = 0;
     CONTROLE            = 0;
     OPERACAO            = 0;
     DESC_CONTA_CREDITO  = '';
     DESC_CONTA_DEBITO   = '';

     /* CONSULTAR OPERAÇÃO CADASTRADA PARA O ADQUIRENTE */
     IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0)THEN
     BEGIN

        FOR
         
            SELECT
             X.OPERACAO_TAXA_MFE,
             X.HISTORICO_CONTABIL,
             X.CONTA_CREDITO,
             X.CONTA_DEBITO,
             COALESCE(Z.DESCRICAO,'') AS DESC_CONTA_CREDITO,
             COALESCE(Y.DESCRICAO,'') AS DESC_CONTA_DEBITO
             FROM
            (SELECT FIRST 1
                E.OPERACAO_TAXA_MFE,
                F.HISTORICO_CONTABIL,
                CASE
                WHEN F.TIPO_CREDITO = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                WHEN F.TIPO_CREDITO = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                ELSE F.CONTA_CREDITO
                END AS CONTA_CREDITO,
                CASE
                WHEN F.TIPO_DEBITO = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                WHEN F.TIPO_DEBITO = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = B.EMPRESA_CODIGO)
                ELSE F.CONTA_DEBITO
                END AS CONTA_DEBITO
                FROM TBPDV_CFE_FORMA_PAGAMENTO A
                    INNER JOIN TBNFS_PARCELAMENTO       B ON B.PDV_CFE_FORMA_PAGAMENTO_ID = A.ID
                    INNER JOIN TBPAGAMENTO_FORMA        C ON C.CODIGO                     = A.PAGAMENTO_FORMA_ID AND (C.NFE_TIPPAG = '03' OR C.NFE_TIPPAG = '04')
                    INNER JOIN TBCARTAO_BANDEIRA        D ON D.DESCRICAO                  = A.BANDEIRA_CARTAO
                    INNER JOIN TBPDV_ADQUIRENTE         E ON E.ADQUIRENTE_ID              = A.ADQUIRENTE_ID
                    LEFT  JOIN TBCONTA_RECEBER_OPERACAO F ON F.CODIGO                     = E.OPERACAO_TAXA_MFE
                WHERE C.EMPRESA_ID > 0
                AND A.ID         = NEW.PDV_CFE_FORMA_PAGAMENTO_ID
                AND B.CONTROLE   = NEW.CONTROLE) X

                LEFT JOIN TBCONTACONTABIL Z ON Z.CONTA = X.CONTA_CREDITO
                LEFT JOIN TBCONTACONTABIL Y ON Y.CONTA = X.CONTA_DEBITO

                INTO :OPERACAO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :DESC_CONTA_CREDITO, :DESC_CONTA_DEBITO DO
                BEGIN

                    IF(:DESC_CONTA_CREDITO = '' AND :CONTA_CREDITO <> '0' AND :CONTA_CREDITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_CREDITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF(:DESC_CONTA_DEBITO = '' AND :CONTA_DEBITO <> '0' AND :CONTA_DEBITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_DEBITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                   FOR
                     SELECT FIRST 1 COALESCE(A.MOVCONTABIL_ID,0), COALESCE(A.MOVCONTMESTRE_ID,0), A.CONTROLE
                        FROM TBCAIXABANCO_LANCAMENTO_REG A
                        WHERE A.ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
                          AND A.EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
                          AND A.DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
                          AND A.NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
                          AND A.NFS_CONTROLE              = OLD.NFS_CONTROLE
                          AND A.REGISTRO_MESTRE           = 1
                          AND A.TARIFA_ADQUIRENTE         = 1
                          INTO :MOVCONTABIL_ID, :MOVCONTMESTRE_ID, :CONTROLE DO
                          BEGIN
                          --EXCEPTION "..."' MOV.CONT: '||:MOVCONTABIL_ID||', MOV.MESTRE: '||:MOVCONTMESTRE_ID||' BCO.ID:'||:CONTROLE;
                          END
                     
                END

     END
     ELSE
     BEGIN
        FOR SELECT
                 X.OPERACAO_TAXA,
                 X.HISTORICO_CONTABIL,
                 X.CONTA_CREDITO,
                 X.CONTA_DEBITO,
                 COALESCE(Z.DESCRICAO,'') AS DESC_CONTA_CREDITO,
                 COALESCE(Y.DESCRICAO,'') AS DESC_CONTA_DEBITO
                 FROM
                (SELECT FIRST 1
                    E.OPERACAO_TAXA,
                    F.HISTORICO_CONTABIL,
                    CASE
                    WHEN F.TIPO_CREDITO = 'A' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    WHEN F.TIPO_CREDITO = 'P' AND F.CONTA_CREDITO = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    ELSE F.CONTA_CREDITO
                    END AS CONTA_CREDITO,
                    CASE
                    WHEN F.TIPO_DEBITO = 'A'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL  FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    WHEN F.TIPO_DEBITO = 'P'  AND F.CONTA_DEBITO  = 0 THEN (SELECT FIRST 1 X.CONTA_CONTABIL2 FROM TBEMPRESA X WHERE X.CODIGO = A.EMPRESA_CODIGO)
                    ELSE F.CONTA_DEBITO
                    END AS CONTA_DEBITO
                    
                    FROM TBNFS_PARCELAMENTO A
                    INNER JOIN TBPAGAMENTO_FORMA        B ON B.CODIGO     = A.PAGAMENTO_FORMA AND (B.NFE_TIPPAG = '03' OR B.NFE_TIPPAG = '04')
                    INNER JOIN TBCONTA_RECEBER_COBRANCA C ON C.CODIGO     = A.CONTA_RECEBER_COBRANCA
                    INNER JOIN TBCARTAO_BANDEIRA        D ON D.NFE_TBAND  = C.NFE_TBAND
                    INNER JOIN TBPDV_ADQUIRENTE         E ON E.EMPRESA_ID = B.EMPRESA_ID
                    LEFT  JOIN TBCONTA_RECEBER_OPERACAO F ON F.CODIGO     = E.OPERACAO_TAXA
                    WHERE B.EMPRESA_ID > 0 AND A.AVULSO = NEW.AVULSO
                    AND (A.NFS_CONTROLE = NEW.NFS_CONTROLE)
                    AND A.CONTROLE      = NEW.CONTROLE) X
                    LEFT JOIN TBCONTACONTABIL Z ON Z.CONTA = X.CONTA_CREDITO
                    LEFT JOIN TBCONTACONTABIL Y ON Y.CONTA = X.CONTA_DEBITO
                INTO :OPERACAO, :HISTORICO_CONTABIL, :CONTA_CREDITO, :CONTA_DEBITO, :DESC_CONTA_CREDITO, :DESC_CONTA_DEBITO DO
                BEGIN
                
                    IF(:DESC_CONTA_CREDITO = '' AND :CONTA_CREDITO <> '0' AND :CONTA_CREDITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_CREDITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END

                    IF(:DESC_CONTA_DEBITO = '' AND :CONTA_DEBITO <> '0' AND :CONTA_DEBITO <> '1' AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 0)THEN
                    BEGIN
                        EXCEPTION "..." 'C.CONTÁBIL: '||FN_MASK(:CONTA_DEBITO,'CONTA')||' NÃO ENCONTRADA, OPERACAO CANCELADA!';
                    END
                     
                   FOR
                     SELECT FIRST 1 COALESCE(A.MOVCONTABIL_ID,0), COALESCE(A.MOVCONTMESTRE_ID,0), A.CONTROLE
                        FROM TBCAIXABANCO_LANCAMENTO_REG A
                        WHERE A.ESTABELECIMENTO_CODIGO    = OLD.ESTABELECIMENTO_CODIGO
                          AND A.EMPRESA_CODIGO            = OLD.EMPRESA_CODIGO
                          AND A.DOCUMENTO_NUMERO          = OLD.NUMERO_NOTAFISCAL
                          AND A.NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE
                          AND A.NFS_CONTROLE              = OLD.NFS_CONTROLE
                          AND A.REGISTRO_MESTRE           = 1
                          AND A.TARIFA_ADQUIRENTE         = 1
                          INTO :MOVCONTABIL_ID, :MOVCONTMESTRE_ID, :CONTROLE DO
                          BEGIN
                          --EXCEPTION "..."' MOV.CONT: '||:MOVCONTABIL_ID||', MOV.MESTRE: '||:MOVCONTMESTRE_ID||' BCO.ID:'||:CONTROLE;
                          END
                     
                END
     END

    IF(:OPERACAO = 0)THEN
    BEGIN
        EXCEPTION "..." 'OPERAÇÃO DE TAXA DO ADQUIRENTE NÃO ENCONTRADA!, OPERAÇÃO CANCELADA.';
    END

    IF(CHAR_LENGTH(TRIM(:HISTORICO_CONTABIL)) > 0)THEN
    BEGIN
      :HISTORICO_CONTABIL = REPLACE(:HISTORICO_CONTABIL,'#NUMERO_NOTAFISCAL#', FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0));
    END

    /* AO ATUALIZAR O CAMPO DO PERCENTUAL DA TAXA DO ADQUIRENTE GERAR LANÇAMENTO DE JUROS */
    IF(CONTROLE = 0) THEN
    BEGIN
       CONTROLE  = GEN_ID(GTBCAIXABANCO_REGISTRO,1);
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 3 AND :MOVCONTMESTRE_ID = 0)THEN
    BEGIN
        MOVCONTMESTRE_ID = GEN_ID(GTBMOVCONTMESTRE,1);

        INSERT INTO TBMOVCONTMESTRE(ID, CODESTABELECIMENTO, DATA)
          VALUES (:MOVCONTMESTRE_ID, NEW.ESTABELECIMENTO_CODIGO, NEW.DATA_EMISSAO);

        MOVCONTABIL_ID     = GEN_ID(TBMOVCONT_ID_GEN,1);
        INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA, DATA, IDDOCUMENTO,
            DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
          VALUES (:MOVCONTABIL_ID, NEW.ESTABELECIMENTO_CODIGO, :MOVCONTMESTRE_ID, 'C', :CONTA_CREDITO, NEW.DATA_EMISSAO,
            :CONTROLE, FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0), 'CRE', NEW.VALOR_TAXA, 0, '');
            
        INSERT INTO TBMOVCONTABIL(ID, CODESTABELECIMENTO, IDCONTMOV, NATUREZA, CONTA, DATA, IDDOCUMENTO,
            DESCRICAO, CODORIGEM, VALOR, IDHISTORICO, HISTORICO)
          VALUES (GEN_ID(TBMOVCONT_ID_GEN,1), NEW.ESTABELECIMENTO_CODIGO, :MOVCONTMESTRE_ID, 'D', :CONTA_DEBITO, NEW.DATA_EMISSAO,
            :CONTROLE, FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0), 'CRE', NEW.VALOR_TAXA, 0, '');
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) > 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) > 3 AND :MOVCONTMESTRE_ID > 0)THEN
    BEGIN
        UPDATE TBMOVCONTMESTRE
          SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
              DATA = NEW.DATA_EMISSAO
          WHERE ID = :MOVCONTMESTRE_ID;

        UPDATE TBMOVCONTABIL
           SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
               CONTA     =  :CONTA_CREDITO,
               DATA      = NEW.DATA_EMISSAO,
               DESCRICAO = FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0),
               VALOR     = NEW.VALOR_TAXA,
               HISTORICO = :HISTORICO_CONTABIL
           WHERE ID = :MOVCONTABIL_ID AND IDCONTMOV = :MOVCONTMESTRE_ID;

         UPDATE TBMOVCONTABIL
           SET CODESTABELECIMENTO = NEW.ESTABELECIMENTO_CODIGO,
               CONTA     = :CONTA_DEBITO,
               DATA      = NEW.DATA_EMISSAO,
               DESCRICAO = FN_LPAD(NEW.NUMERO_NOTAFISCAL,7,0),
               VALOR     = NEW.VALOR_TAXA,
               HISTORICO = :HISTORICO_CONTABIL
           WHERE ID <> :MOVCONTABIL_ID AND IDCONTMOV = :MOVCONTMESTRE_ID;
    END

    IF(CHAR_LENGTH(TRIM(:CONTA_CREDITO)) < 3 AND CHAR_LENGTH(TRIM(:CONTA_DEBITO)) < 3 AND :MOVCONTMESTRE_ID > 0)THEN
    BEGIN
        DELETE FROM TBMOVCONTMESTRE WHERE ID        = :MOVCONTMESTRE_ID;
        DELETE FROM TBMOVCONTABIL   WHERE IDCONTMOV = :MOVCONTMESTRE_ID;
    END

    IF(NEW.AVULSO = 1)THEN
    BEGIN
       TIPO_LANC = 'AVU';
    END
    ELSE
    BEGIN
       IF(NEW.PDV_CFE_FORMA_PAGAMENTO_ID > 0)THEN
       BEGIN
          TIPO_LANC = 'CFE';
       END
       ELSE
       BEGIN
          TIPO_LANC = 'NFS';
       END
    END

    FOR SELECT FIRST 1 CAST(COALESCE(A.VALOR_SALDO,0) AS NUMERIC(15,2)) VALOR_SALDO
        FROM TBNFS_PARCELAMENTO A
        WHERE A.NFS_CONTROLE = NEW.NFS_CONTROLE
        AND A.CONTROLE = NEW.CONTROLE INTO :VALOR_SALDO DO
        BEGIN
            IF(:VALOR_SALDO > 0) THEN
            BEGIN
                --EXCEPTION "..." 'ATENÇÃO SALDO DA PARCELA('||:VALOR_SALDO||'), OPERACAO CANCELADA!';
                UPDATE OR INSERT INTO TBCAIXABANCO_LANCAMENTO_REG (
                    CONTROLE, 
                    ESTABELECIMENTO_CODIGO,
                    EMPRESA_CODIGO,
                    NFS_PARCELAMENTO_CONTROLE,
                    OPERACAO_CODIGO,
                    DOCUMENTO_NUMERO,
                    PARCELA,
                    REGISTRO_MESTRE,
                    DATA,
                    VALOR,
                    VALOR_SALDO,
                    VALOR_TOTAL,
                    TIPO,
                    SERIE,
                    NFE_CONTROLE,
                    NFS_CONTROLE,
                    CODORIGEM,
                    CONTA_DEBITO,
                    CONTA_CREDITO,
                    MOVCONTABIL_ID,
                    MOVCONTMESTRE_ID,
                    TARIFA_ADQUIRENTE
                    )
                    VALUES
                    (
                    :CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.EMPRESA_CODIGO,
                    NEW.CONTROLE,
                    :OPERACAO,
                    NEW.NUMERO_NOTAFISCAL,
                    NEW.PARCELA,
                    '1',
                    NEW.DATA_EMISSAO,
                    NEW.VALOR_TAXA,
                    NEW.VALOR_SALDO,
                    NEW.VALOR_TAXA,
                    'C',
                    NEW.SERIE,
                    0,
                    NEW.NFS_CONTROLE,
                    'CRE',
                    :CONTA_DEBITO,
                    :CONTA_CREDITO,
                    :MOVCONTABIL_ID,
                    :MOVCONTMESTRE_ID,
                    1
                    )
                MATCHING(CONTROLE,TARIFA_ADQUIRENTE);
        
        
                EXECUTE PROCEDURE SPU_CONTA_RECEBER_SALDO2(NEW.NFS_CONTROLE,NEW.CONTROLE);
        
        
                UPDATE TBNFS_PARCELAMENTO A SET A.VALOR_SALDO = COALESCE((SELECT SUM(CASE WHEN B.TIPO = 'C'
                    THEN B.VALOR_TOTAL*-1  ELSE B.VALOR_TOTAL END) SALDO FROM TBCAIXABANCO_LANCAMENTO_REG B
                    WHERE B.NFS_CONTROLE = A.NFS_CONTROLE
                    AND B.TIPO IN ('D','C')
                    AND B.NFS_PARCELAMENTO_CONTROLE = A.CONTROLE),0)
                    WHERE A.NFS_CONTROLE = NEW.NFS_CONTROLE
                    AND A.CONTROLE = NEW.CONTROLE;
        
                FOR SELECT FIRST 1 CAST(COALESCE(A.VALOR_SALDO,0) AS NUMERIC(15,2)) VALOR_SALDO
                    FROM TBNFS_PARCELAMENTO A
                    WHERE A.NFS_CONTROLE = NEW.NFS_CONTROLE
                    AND A.CONTROLE = NEW.CONTROLE INTO :VALOR_SALDO DO
                    BEGIN
                        IF(:VALOR_SALDO < 0) THEN
                        BEGIN
                             EXCEPTION "..." 'ATENÇÃO SALDO DA PARCELA NEGATIVO, OPERACAO CANCELADA!';
                        END
                    END
            END
        END

  END
END;