SET TERM ^ ;

CREATE OR ALTER trigger ttbcaixabanco_lancamento_b1i_01 for tbcaixabanco_lancamento
active before insert position 1
AS
Declare Variable Saldo Numeric(15,4);
BEGIN
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 (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
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbcaixabanco_lancamento_b1u_01 for tbcaixabanco_lancamento
active before update position 1
AS
Declare Variable Saldo Numeric(15,4);
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

        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
^

SET TERM ; ^

