ALTER TABLE TBCHEQUE
    ADD DATA_LANC_DISP DATE,
    ADD DATA_LANC_BAIXA DATE,
    ADD DATA_LANC_DEV DATE;

/******************************************************************/

COMMENT ON COLUMN TBCHEQUE.DATA_LANC_DISP IS
'Data que o cheque se tronou disponivel (baixa das parcelas, lancamento de adiantamento ou registro)';

COMMENT ON COLUMN TBCHEQUE.DATA_LANC_BAIXA IS
'Data que o cheque foi baixado (transferencia ou adiantamento)';

COMMENT ON COLUMN TBCHEQUE.DATA_LANC_DEV IS
'Data que o cheque foi devolvido';

/******************************************************************/
/******************************************************************/
/******************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbcheque_b03iu for tbcheque
active before insert or update position 10
AS
DECLARE VARIABLE DATA1 DATE;
DECLARE VARIABLE DATA2 DATE;
DECLARE VARIABLE DATA3 DATE;
BEGIN

    :DATA1 = COALESCE((SELECT FIRST 1
                            DATA_LANCAMENTO
                        FROM (
                            SELECT DISTINCT
                                /*A.CONTROLE,*/
                                IIF(T.CHEQUE_SEM_PARCELA = '1', T.DATA_EMISSAO, A.DATA_LANCAMENTO) AS DATA_LANCAMENTO/*,
                            
                                IIF(T.CHEQUE_SEM_PARCELA = '2', 'BX ADIANT',
                                IIF(T.CHEQUE_SEM_PARCELA = '1', 'CHEQUE', 'BX PARC')) AS TIPO*/
                            
                            FROM TBCHEQUE T
                            LEFT JOIN TBCAIXABANCO_LANCAMENTO A ON A.CHEQUE_ID = T.ID AND IIF(T.CHEQUE_SEM_PARCELA = '2', A.ADIANTAMENTO_CHEQUE = '1', A.TIPO <> 'L')
                            WHERE T.ID > 0
                            AND T.ID = NEW.ID
                        )
                    ), NULL); /* Parcelas Baixadas */

    :DATA2 = COALESCE((SELECT FIRST 1
                            DATA_LANCAMENTO
                        FROM (
                            SELECT DISTINCT
                                /*A.CONTROLE,*/
                                A.DATA_LANCAMENTO/*,
                            
                                IIF(NEW.SITUACAO IN ('1', '2', '7', '8'), 'TRANSF', 'ANTECIP') AS TIPO*/
                            
                            FROM TBCHEQUE T
                            LEFT JOIN TBCAIXABANCO_LANC_CLASS_SALDO C ON C.CHEQUE_ID = T.ID
                            LEFT JOIN TBCAIXABANCO_LANCAMENTO_CLASS B ON B.CONTROLE = C.LANC_CLASS_ID
                            LEFT JOIN TBCAIXABANCO_LANCAMENTO A ON A.TIPO = 'L' AND IIF(NEW.SITUACAO IN ('1', '2', '7', '8'), (A.CHEQUE_ID = T.ID AND IIF(T.CHEQUE_SEM_PARCELA = '1', A.BAIXA_CHEQUE_SEM_PARCELA = '1', A.TRANSFERENCIA = '1')), (A.CONTROLE = B.CAIXABANCO_CONTROLE))
                            WHERE T.ID > 0
                            AND T.ID = NEW.ID
                        )
                    ), NULL); /* Cheque Baixado */

    :DATA3 = COALESCE((SELECT FIRST 1
                            DATA_LANCAMENTO
                        FROM (
                            SELECT DISTINCT
                                /*A.CONTROLE,*/
                                A.DATA_LANCAMENTO/*,
                            
                                'DEVOL' AS TIPO*/
                            
                            FROM TBCHEQUE T
                            LEFT JOIN TBCAIXABANCO_LANCAMENTO A ON A.CHEQUE_ID = T.ID AND A.DEVOLUCAO_CHEQUE = '1'
                            WHERE T.ID > 0
                            AND T.ID = NEW.ID
                        )
                    ), NULL); /* Cheque Devolvido */


    IF (INSERTING) THEN
    BEGIN

        IF (NEW.SITUACAO IN ('3', '6')) THEN
        BEGIN

            NEW.DATA_LANC_DISP = :DATA1;

        END

    END ELSE
    IF (UPDATING) THEN
    BEGIN

        /* Preenchimento dos campos de data */
        IF (OLD.SITUACAO = '0' AND NEW.SITUACAO IN ('3', '6')) THEN
        BEGIN

            NEW.DATA_LANC_DISP = :DATA1;

        END

        IF (OLD.SITUACAO IN ('3', '6') AND NEW.SITUACAO IN ('1', '4')) THEN
        BEGIN

            NEW.DATA_LANC_BAIXA = :DATA2;

        END

        IF (OLD.SITUACAO IN ('1', '4') AND NEW.SITUACAO IN ('2', '5')) THEN
        BEGIN

            NEW.DATA_LANC_DEV = :DATA3;

        END

        /* Limpando os campos de data */
        IF (OLD.SITUACAO IN ('2', '5') AND NEW.SITUACAO IN ('1', '4')) THEN
        BEGIN

            NEW.DATA_LANC_DEV = NULL;

        END

        IF (OLD.SITUACAO IN ('2', '5') AND NEW.SITUACAO IN ('3', '6')) THEN
        BEGIN

            NEW.DATA_LANC_DEV   = NULL;
            NEW.DATA_LANC_BAIXA = NULL;

        END

        IF (OLD.SITUACAO IN ('2', '5') AND NEW.SITUACAO = '0') THEN
        BEGIN

            NEW.DATA_LANC_DEV   = NULL;
            NEW.DATA_LANC_BAIXA = NULL;    
            NEW.DATA_LANC_DISP  = NULL;

        END


        IF (OLD.SITUACAO IN ('1', '4') AND NEW.SITUACAO IN ('3', '6')) THEN
        BEGIN

            NEW.DATA_LANC_BAIXA = NULL;    

        END

        IF (OLD.SITUACAO IN ('1', '4') AND NEW.SITUACAO = '0') THEN
        BEGIN

            NEW.DATA_LANC_BAIXA = NULL;    
            NEW.DATA_LANC_DISP  = NULL;   

        END


        IF (OLD.SITUACAO IN ('3', '6') AND NEW.SITUACAO = '0') THEN
        BEGIN

            NEW.DATA_LANC_DISP  = NULL;

        END

    END

END
^

SET TERM ; ^

/******************************************************************/
/******************************************************************/
/******************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SPU_CHEQUE_DATAS_PROCESSOS
as
declare variable CHEQUE_ID integer;
declare variable DATA_LANCAMENTO date;
BEGIN

    FOR
        /* Cheque Dispon??vel */
        SELECT DISTINCT
            /*A.CONTROLE,*/
            T.ID AS CHEQUE_ID,
            CAST(IIF(T.CHEQUE_SEM_PARCELA = '1', T.DATA_EMISSAO, A.DATA_LANCAMENTO) AS DATE) AS DATA_LANCAMENTO/*,
        
            IIF(T.CHEQUE_SEM_PARCELA = '2', 'BX ADIANT',
            IIF(T.CHEQUE_SEM_PARCELA = '1', 'CHEQUE', 'BX PARC')) AS TIPO*/
        
        FROM TBCHEQUE T
        LEFT JOIN TBCAIXABANCO_LANCAMENTO A ON A.CHEQUE_ID = T.ID AND IIF(T.CHEQUE_SEM_PARCELA = '2', A.ADIANTAMENTO_CHEQUE = '1', A.TIPO <> 'L')
        WHERE T.ID > 0
        AND T.SITUACAO NOT IN ('0')

    INTO
        :CHEQUE_ID,
        :DATA_LANCAMENTO
            
    DO
    BEGIN

        UPDATE TBCHEQUE T SET T.DATA_LANC_DISP = :DATA_LANCAMENTO WHERE ID = :CHEQUE_ID;

    END

    
    FOR
    /* Cheque Baixado */
        SELECT DISTINCT
            /*A.CONTROLE,*/
            T.ID AS CHEQUE_ID,
            CAST(A.DATA_LANCAMENTO AS DATE) AS DATA_LANCAMENTO/*,
        
            IIF(T.SITUACAO IN (1, 2, 7, 8), 'TRANSF', 'ANTECIP') AS TIPO*/
        
        FROM TBCHEQUE T
        LEFT JOIN TBCAIXABANCO_LANC_CLASS_SALDO C ON C.CHEQUE_ID = T.ID
        LEFT JOIN TBCAIXABANCO_LANCAMENTO_CLASS B ON B.CONTROLE = C.LANC_CLASS_ID
        LEFT JOIN TBCAIXABANCO_LANCAMENTO A ON A.TIPO = 'L' AND IIF(T.SITUACAO IN (1, 2, 7, 8), (A.CHEQUE_ID = T.ID AND IIF(T.CHEQUE_SEM_PARCELA = '1', A.BAIXA_CHEQUE_SEM_PARCELA = '1', A.TRANSFERENCIA = '1')), (A.CONTROLE = B.CAIXABANCO_CONTROLE))
        WHERE T.ID > 0
        AND T.SITUACAO IN ('1', '2', '7', '4', '5', '8')
        
    INTO
        :CHEQUE_ID,
        :DATA_LANCAMENTO
            
    DO
    BEGIN

        UPDATE TBCHEQUE T SET T.DATA_LANC_BAIXA = :DATA_LANCAMENTO WHERE ID = :CHEQUE_ID;

    END

    
    FOR
        /* Cheque Devolvido */
        SELECT DISTINCT
            /*A.CONTROLE,*/
            T.ID AS CHEQUE_ID,
            CAST(A.DATA_LANCAMENTO AS DATE) AS DATA_LANCAMENTO/*,
        
            'DEVOL' AS TIPO*/
        
        FROM TBCHEQUE T
        LEFT JOIN TBCAIXABANCO_LANCAMENTO A ON A.CHEQUE_ID = T.ID AND A.DEVOLUCAO_CHEQUE = '1'
        WHERE T.ID > 0
        AND T.SITUACAO IN ('2', '7', '5', '8')

    INTO
        :CHEQUE_ID,
        :DATA_LANCAMENTO
            
    DO
    BEGIN

        UPDATE TBCHEQUE T SET T.DATA_LANC_DEV = :DATA_LANCAMENTO WHERE ID = :CHEQUE_ID;

    END

END
^

SET TERM ; ^

