alter table TBCAIXABANCO_CONCILIACAO_BLOQ
    alter column BANCO_CONTA type varchar(50);

alter table TBCAIXABANCO_CONCILIACAO_HIST
    alter column BANCO_CONTA type varchar(50);

CREATE OR ALTER TRIGGER TTBCAIXABANCO_CONC_LANC_B01U FOR TBCAIXABANCO_CONCILIACAO_LANC
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE BLOQUEIO INTEGER;
BEGIN
  IF(NEW.CONCILIACAO IS DISTINCT FROM OLD.CONCILIACAO)THEN
  BEGIN
     BLOQUEIO = COALESCE((SELECT FIRST 1 1 FROM TBCAIXABANCO_CONCILIACAO_BLOQ A WHERE A.BANCO_CONTA = OLD.BANCO_CONTA AND A.BANCO_CODIGO = OLD.BANCO_CODIGO AND A.DATA = OLD.DATA AND A.STATUS = '0'),0);
    
     IF(BLOQUEIO = 1)THEN
     BEGIN
    
        EXCEPTION "..." '<H4>ATENCAO</H4> REGISTRO DE CONCILIACAO BANCARIA BLOQUEADO!<BR>DATA: '||FORMATDATE(OLD.DATA)||
                          '. <BR> BANCO:'||COALESCE((SELECT FIRST 1 FN_LPAD(B.CODIGO,4,0)||' - '||B.DESCRICAO FROM TBBANCO B WHERE B.CODIGO = OLD.BANCO_CODIGO),'')||
                          '. <BR> CONTA:'||OLD.BANCO_CONTA||'<BR> ENTRE EM CONTATO COM O SETOR RESPONSAVEL.';
    
     END
  END
END^

CREATE OR ALTER TRIGGER TTBCAIXABANCO_CONC_LANC_B01D FOR TBCAIXABANCO_CONCILIACAO_LANC
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE BLOQUEIO INTEGER;
BEGIN
   BLOQUEIO = COALESCE((SELECT FIRST 1 1 FROM TBCAIXABANCO_CONCILIACAO_BLOQ A WHERE A.BANCO_CONTA = OLD.BANCO_CONTA AND A.BANCO_CODIGO = OLD.BANCO_CODIGO AND A.DATA = OLD.DATA AND A.STATUS = '0'),0);

   IF(BLOQUEIO = 1)THEN
   BEGIN

      EXCEPTION "..." '<H4>ATENCAO</H4> REGISTRO DE CONCILIACAO BANCARIA BLOQUEADO!<BR>DATA: '||FORMATDATE(OLD.DATA)||
                      '. <BR> BANCO:'||COALESCE((SELECT FIRST 1 FN_LPAD(B.CODIGO,4,0)||' - '||B.DESCRICAO FROM TBBANCO B WHERE B.CODIGO = OLD.BANCO_CODIGO),'')||
                      '. <BR> CONTA:'||OLD.BANCO_CONTA||'<BR> ENTRE EM CONTATO COM O SETOR RESPONSAVEL.';

   END
END^

CREATE OR ALTER TRIGGER TTBCAIXABANCO_LANCAMENTO_B04I FOR TBCAIXABANCO_LANCAMENTO
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
declare variable ID_CONCILIACAO INTEGER;
declare variable BLOQUEAR INTEGER;
declare variable DESCRICAO_BANCO VARCHAR(500);
declare variable DATA_CONCILIACAO DATE;
declare variable CONTA_CONCILIACAO VARCHAR(50);
begin
    IF(INSERTING)THEN
    BEGIN
        FOR
         SELECT FIRST 1
            X.DESCRICAO_BANCO,
            X.CONTA_CONCILIACAO,
            X.DATA_CONCILIACAO,
            X.BLOQUEAR
           FROM (
              SELECT
                 FN_LPAD(B.CODIGO,4,0)||' - '||B.DESCRICAO AS DESCRICAO_BANCO,
                 Z.CONTA_CONCILIACAO AS CONTA_CONCILIACAO,
                 NEW.DATA_LANCAMENTO AS DATA_CONCILIACAO,
                 coalesce((select first 1 1 from TBCAIXABANCO_CONCILIACAO_BLOQ a where a.BANCO_CONTA = Z.CONTA_CONCILIACAO
                 and a.BANCO_CODIGO = Z.BANCO_CODIGO and a.DATA = NEW.DATA_LANCAMENTO and a.STATUS = '0'),0) AS BLOQUEAR
                 FROM TBCAIXABANCO Z, TBBANCO B
                 WHERE Z.CODIGO = NEW.CAIXABANCO_CODIGO
                 AND Z.BANCO_CODIGO = B.CODIGO
           ) X
           WHERE X.BLOQUEAR = 1
           INTO DESCRICAO_BANCO, CONTA_CONCILIACAO, DATA_CONCILIACAO, BLOQUEAR DO
           BEGIN
              IF(BLOQUEAR = 1)THEN
              BEGIN
                 exception "..." '<H4>ATENCAO</H4> LANCAMENTO COM CONCILIACAO BANCARIA BLOQUEADA!<BR>DATA: '||FORMATDATE(DATA_CONCILIACAO)||
              '. <BR> BANCO:'||COALESCE(DESCRICAO_BANCO,'')||
              '. <BR> CONTA:'||CONTA_CONCILIACAO||'.<BR> ENTRE EM CONTATO COM O SETOR RESPONSAVEL.';
              END
           END

        if(new.DATA_COMPETENCIA is not null)then
        begin
           new.DATA_COMPETENCIA = FN_START_OF_MONTH_2(new.DATA_COMPETENCIA);
        end
    
        if(new.DATA_COMPETENCIA is null)then
        begin
           new.DATA_COMPETENCIA = FN_START_OF_MONTH_2(new.DATA_LANCAMENTO);
        end
    END
    IF(UPDATING)THEN
    BEGIN
        if(new.DATA_COMPETENCIA is not null)then
        begin
           new.DATA_COMPETENCIA = FN_START_OF_MONTH_2(new.DATA_COMPETENCIA);
        end
    END
end^

CREATE OR ALTER TRIGGER TTBCAIXABANCO_LANCAMENTO_B1D_01 FOR TBCAIXABANCO_LANCAMENTO
ACTIVE BEFORE DELETE POSITION 1
AS

declare variable BLOQUEAR INTEGER;
declare variable DESCRICAO_BANCO VARCHAR(500);
declare variable DATA_CONCILIACAO DATE;
declare variable CONTA_CONCILIACAO VARCHAR(50);

BEGIN
   IF(OLD.CONCILIACAO = '1')THEN
    BEGIN
        FOR
          SELECT FIRST 1
                X.DESCRICAO_BANCO,
                X.CONTA_CONCILIACAO,
                X.DATA_CONCILIACAO,
                X.BLOQUEAR
              FROM(
                  SELECT
                     coalesce((SELECT FIRST 1 FN_LPAD(ZT.CODIGO,4,0)||' - '||ZT.DESCRICAO FROM TBBANCO ZT WHERE ZT.CODIGO = X.BANCO_CODIGO),'') AS DESCRICAO_BANCO,
                     X.BANCO_CONTA AS CONTA_CONCILIACAO,
                     X.DATA AS DATA_CONCILIACAO,
                     coalesce((select first 1 1 from TBCAIXABANCO_CONCILIACAO_BLOQ a where a.BANCO_CONTA = X.banco_conta
                     and a.BANCO_CODIGO = X.BANCO_CODIGO and a.DATA = X.DATA and a.STATUS = '0'),0) AS BLOQUEAR
                     FROM TBCAIXABANCO_CONCILIACAO_DET Z, TBCAIXABANCO_CONCILIACAO_LANC X
                     WHERE Z.CAIXABANCO_LANC_ID = OLD.CONTROLE
                     AND X.ID = Z.CONCILIACAO_LANC_ID
               ) X
               WHERE X.BLOQUEAR = 1
               INTO DESCRICAO_BANCO, CONTA_CONCILIACAO, DATA_CONCILIACAO, BLOQUEAR DO
               BEGIN
                  IF(BLOQUEAR = 1)THEN
                  BEGIN
                     exception "..." '<H4>ATENCAO</H4> LANCAMENTO COM CONCILIACAO BANCARIA BLOQUEADA!<BR>DATA: '||FORMATDATE(DATA_CONCILIACAO)||
                  '. <BR> BANCO:'||COALESCE(DESCRICAO_BANCO,'')||
                  '. <BR> CONTA:'||CONTA_CONCILIACAO||'.<BR> ENTRE EM CONTATO COM O SETOR RESPONSAVEL.';
                  END
               END

        DELETE FROM TBCAIXABANCO_CONCILIACAO_DET Z WHERE Z.CAIXABANCO_LANC_ID = OLD.CONTROLE;
    END
    ELSE IF(COALESCE(OLD.CONCILIACAO,'0') = '0') THEN
       BEGIN
        FOR
         SELECT FIRST 1
            X.DESCRICAO_BANCO,
            X.CONTA_CONCILIACAO,
            X.DATA_CONCILIACAO,
            X.BLOQUEAR
           FROM (
              SELECT
                 FN_LPAD(B.CODIGO,4,0)||' - '||B.DESCRICAO AS DESCRICAO_BANCO,
                 Z.CONTA_CONCILIACAO AS CONTA_CONCILIACAO,
                 OLD.DATA_LANCAMENTO AS DATA_CONCILIACAO,
                 coalesce((select first 1 1 from TBCAIXABANCO_CONCILIACAO_BLOQ a where a.BANCO_CONTA = Z.CONTA_CONCILIACAO
                 and a.BANCO_CODIGO = Z.BANCO_CODIGO and a.DATA = OLD.DATA_LANCAMENTO and a.STATUS = '0'),0) AS BLOQUEAR
                 FROM TBCAIXABANCO Z, TBBANCO B
                 WHERE Z.CODIGO = OLD.CAIXABANCO_CODIGO
                 AND Z.BANCO_CODIGO = B.CODIGO
           ) X
           WHERE X.BLOQUEAR = 1
           INTO DESCRICAO_BANCO, CONTA_CONCILIACAO, DATA_CONCILIACAO, BLOQUEAR DO
           BEGIN
              IF(BLOQUEAR = 1)THEN
              BEGIN
                 exception "..." '<H4>ATENCAO</H4> LANCAMENTO COM CONCILIACAO BANC??RIA BLOQUEADA!<BR>DATA: '||FORMATDATE(DATA_CONCILIACAO)||
              '. <BR> BANCO:'||COALESCE(DESCRICAO_BANCO,'')||
              '. <BR> CONTA:'||CONTA_CONCILIACAO||'.<BR> ENTRE EM CONTATO COM O SETOR RESPONSAVEL.';
              END
           END
    END

    IF(OLD.CONTROLE > 0) THEN
      BEGIN
        IF (OLD.NATUREZA = 'C') THEN
            BEGIN
    
            UPDATE TBCAIXABANCO_SALDO_DIARIO SET
            SALDO = SALDO + OLD.VALOR_TOTAL
             WHERE CODIGO = OLD.CAIXABANCO_CODIGO
               AND DATA  >= OLD.DATA_LANCAMENTO;
    
            UPDATE TBCAIXABANCO SET 
            SALDO = SALDO + OLD.VALOR_TOTAL WHERE CODIGO = OLD.CAIXABANCO_CODIGO;
    
            END
        IF (OLD.NATUREZA = 'D') THEN
            BEGIN
    
            UPDATE TBCAIXABANCO_SALDO_DIARIO SET
            SALDO = SALDO - OLD.VALOR_TOTAL
             WHERE CODIGO = OLD.CAIXABANCO_CODIGO
               AND DATA  >= OLD.DATA_LANCAMENTO;
    
            UPDATE TBCAIXABANCO SET 
            SALDO = SALDO - OLD.VALOR_TOTAL WHERE CODIGO = OLD.CAIXABANCO_CODIGO;
    
            END
    
         DELETE FROM TBCAIXABANCO_LANCAMENTO_CLASS WHERE CAIXABANCO_CONTROLE = OLD.CONTROLE;

         IF(OLD.CONCILIACAO = '1')THEN
         BEGIN
            DELETE FROM TBCAIXABANCO_CONCILIACAO_DET Z WHERE Z.CAIXABANCO_LANC_ID = OLD.CONTROLE;
         END
      END
END^

CREATE OR ALTER TRIGGER TTBCAIXABANCO_LANCAMENTO_B1U_01 FOR TBCAIXABANCO_LANCAMENTO
ACTIVE BEFORE UPDATE POSITION 1
AS
DECLARE VARIABLE SALDO NUMERIC(15,4);
declare variable ID_CONCILIACAO INTEGER;
declare variable BLOQUEAR INTEGER;
declare variable DESCRICAO_BANCO VARCHAR(500);
declare variable DATA_CONCILIACAO DATE;
declare variable CONTA_CONCILIACAO VARCHAR(50);
BEGIN

IF (OLD.CAIXABANCO_CODIGO <> NEW.CAIXABANCO_CODIGO OR
    OLD.DATA_LANCAMENTO   <> NEW.DATA_LANCAMENTO OR
    OLD.NATUREZA          <> NEW.NATUREZA OR
    OLD.VALOR_TOTAL       <> NEW.VALOR_TOTAL) THEN
    BEGIN
        IF(OLD.CONCILIACAO = '1')THEN
        BEGIN
            FOR
              SELECT FIRST 1
                    X.ID_CONCILIACAO,
                    X.DESCRICAO_BANCO,
                    X.CONTA_CONCILIACAO,
                    X.DATA_CONCILIACAO,
                    X.BLOQUEAR
                  FROM(
                      SELECT
                         Z.ID AS ID_CONCILIACAO,
                         coalesce((SELECT FIRST 1 FN_LPAD(ZT.CODIGO,4,0)||' - '||ZT.DESCRICAO FROM TBBANCO ZT WHERE ZT.CODIGO = X.BANCO_CODIGO),'') AS DESCRICAO_BANCO,
                         X.BANCO_CONTA AS CONTA_CONCILIACAO,
                         X.DATA AS DATA_CONCILIACAO,
                         coalesce((select first 1 1 from TBCAIXABANCO_CONCILIACAO_BLOQ a where a.BANCO_CONTA = X.banco_conta
                         and a.BANCO_CODIGO = X.BANCO_CODIGO and a.DATA = X.DATA and a.STATUS = '0'),0) AS BLOQUEAR
                         FROM TBCAIXABANCO_CONCILIACAO_DET Z, TBCAIXABANCO_CONCILIACAO_LANC X
                         WHERE Z.CAIXABANCO_LANC_ID = OLD.CONTROLE
                         AND X.ID = Z.CONCILIACAO_LANC_ID
                   ) X
                   WHERE X.BLOQUEAR = 1
                   INTO ID_CONCILIACAO, DESCRICAO_BANCO, CONTA_CONCILIACAO, DATA_CONCILIACAO, BLOQUEAR DO
                   BEGIN
                      IF(BLOQUEAR = 1)THEN
                      BEGIN
                         exception "..." '<H4>ATENCAO</H4> LANCAMENTO COM CONCILIACAO BANCARIA BLOQUEADA!<BR>DATA: '||FORMATDATE(DATA_CONCILIACAO)||
                      '. <BR> BANCO:'||COALESCE(DESCRICAO_BANCO,'')||
                      '. <BR> CONTA:'||CONTA_CONCILIACAO||'.<BR> ENTRE EM CONTATO COM O SETOR RESPONSAVEL.';
                      END
                   END

            DELETE FROM TBCAIXABANCO_CONCILIACAO_DET Z WHERE Z.CAIXABANCO_LANC_ID = OLD.CONTROLE;
        END
        ELSE IF(COALESCE(OLD.CONCILIACAO,'0') = '0') THEN
           BEGIN
            FOR
             SELECT FIRST 1
                X.ID_CONCILIACAO,
                X.DESCRICAO_BANCO,
                X.CONTA_CONCILIACAO,
                X.DATA_CONCILIACAO,
                X.BLOQUEAR
               FROM (
                  SELECT
                     Z.CODIGO AS ID_CONCILIACAO,
                     FN_LPAD(B.CODIGO,4,0)||' - '||B.DESCRICAO AS DESCRICAO_BANCO,
                     Z.CONTA_CONCILIACAO AS CONTA_CONCILIACAO,
                     OLD.DATA_LANCAMENTO AS DATA_CONCILIACAO,
                     coalesce((select first 1 1 from TBCAIXABANCO_CONCILIACAO_BLOQ a where a.BANCO_CONTA = Z.CONTA_CONCILIACAO
                     and a.BANCO_CODIGO = Z.BANCO_CODIGO and a.DATA = OLD.DATA_LANCAMENTO and a.STATUS = '0'),0) AS BLOQUEAR
                     FROM TBCAIXABANCO Z, TBBANCO B
                     WHERE Z.CODIGO = OLD.CAIXABANCO_CODIGO
                     AND Z.BANCO_CODIGO = B.CODIGO
               ) X
               WHERE X.BLOQUEAR = 1
               INTO ID_CONCILIACAO, DESCRICAO_BANCO, CONTA_CONCILIACAO, DATA_CONCILIACAO, BLOQUEAR DO
               BEGIN
                  IF(BLOQUEAR = 1)THEN
                  BEGIN
                     exception "..." '<H4>ATENCAO</H4> LANCAMENTO COM CONCILIACAO BANC??RIA BLOQUEADA!<BR>DATA: '||FORMATDATE(DATA_CONCILIACAO)||
                  '. <BR> BANCO:'||COALESCE(DESCRICAO_BANCO,'')||
                  '. <BR> CONTA:'||CONTA_CONCILIACAO||'.<BR> ENTRE EM CONTATO COM O SETOR RESPONSAVEL.';
                  END
               END
        END
        
        FOR
        SELECT
        COALESCE((SELECT FIRST 1 B.SALDO
           FROM TBCAIXABANCO_SALDO_DIARIO B
          WHERE B.CODIGO = NEW.CAIXABANCO_CODIGO
            AND B.DATA  <= NEW.DATA_LANCAMENTO
          ORDER BY B.DATA DESC),0) SALDO
        FROM RDB$DATABASE
        INTO :SALDO
        DO
        BEGIN
        
                UPDATE OR INSERT INTO TBCAIXABANCO_SALDO_DIARIO (CODIGO, DATA, SALDO)
                    VALUES (NEW.CAIXABANCO_CODIGO, NEW.DATA_LANCAMENTO, :SALDO)
                    MATCHING (CODIGO, DATA);
            
                IF (OLD.CAIXABANCO_CODIGO > 0) THEN
                    BEGIN
                    IF (OLD.NATUREZA = 'C') THEN
                        BEGIN
                
                        UPDATE TBCAIXABANCO_SALDO_DIARIO SET
                        SALDO = SALDO + OLD.VALOR_TOTAL
                         WHERE CODIGO = OLD.CAIXABANCO_CODIGO
                           AND DATA  >= OLD.DATA_LANCAMENTO;
                
                        UPDATE TBCAIXABANCO SET 
                        SALDO = SALDO + OLD.VALOR_TOTAL WHERE CODIGO = OLD.CAIXABANCO_CODIGO;
                
                        END
                    IF (OLD.NATUREZA = 'D') THEN
                        BEGIN
                
                        UPDATE TBCAIXABANCO_SALDO_DIARIO SET
                        SALDO = SALDO - OLD.VALOR_TOTAL
                         WHERE CODIGO = OLD.CAIXABANCO_CODIGO
                           AND DATA  >= OLD.DATA_LANCAMENTO;
                
                        UPDATE TBCAIXABANCO SET 
                        SALDO = SALDO - OLD.VALOR_TOTAL WHERE CODIGO = OLD.CAIXABANCO_CODIGO;
                
                        END
                    END
            
                IF (NEW.CAIXABANCO_CODIGO > 0) THEN
                    BEGIN

                    IF (NEW.NATUREZA = 'D') THEN
                        BEGIN
                        UPDATE TBCAIXABANCO_SALDO_DIARIO SET
                        SALDO = SALDO + NEW.VALOR_TOTAL
                         WHERE CODIGO = NEW.CAIXABANCO_CODIGO
                           AND DATA  >= NEW.DATA_LANCAMENTO;
                
                        UPDATE TBCAIXABANCO SET 
                        SALDO = SALDO + NEW.VALOR_TOTAL WHERE CODIGO = NEW.CAIXABANCO_CODIGO;
                        END
                
                    IF (NEW.NATUREZA = 'C') THEN
                        BEGIN
                        UPDATE TBCAIXABANCO_SALDO_DIARIO SET
                        SALDO = SALDO - NEW.VALOR_TOTAL
                         WHERE CODIGO = NEW.CAIXABANCO_CODIGO
                           AND DATA  >= NEW.DATA_LANCAMENTO;
                
                        UPDATE TBCAIXABANCO SET 
                        SALDO = SALDO - NEW.VALOR_TOTAL WHERE CODIGO = NEW.CAIXABANCO_CODIGO;
                        END
            
                    END
        END
    END

END^