SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROCESSAR_TEMPO_REAL_V2 (
    I_PROGRAMACAO_ID integer)
returns (
    O_TEMPO_FRACAO_MINUTO numeric(18,4))
as
declare variable HISTORICO_ID integer;
declare variable HISTORICO_DATAHORA timestamp;
declare variable HISTORICO_STATUS char(1);
declare variable STATUS_ANTERIOR char(1);
declare variable DATAHORA_ANTERIOR timestamp;
declare variable PROGRAMACAO_ID integer;
declare variable TEMPO_FRACAO_DIA numeric(18,4);
begin
        :PROGRAMACAO_ID = I_PROGRAMACAO_ID;
        /* INICIALIZA O CONTADOR DE TEMPO TOTAL */
        TEMPO_FRACAO_DIA = 0;
    
        /* INICIO DO LACO QUE CONSULTA OS HISTORICOS DA PROGRAMACAO */
        FOR
            SELECT
                R.ID,
                R.DATAHORA,
                R.STATUS
             FROM TBPROGRAMACAO_REGISTRO R
            WHERE R.PROGRAMACAO_ID = :PROGRAMACAO_ID
            and r.justificativa_id <> 888
            ORDER BY DATAHORA
        INTO
            :HISTORICO_ID,
            :HISTORICO_DATAHORA, 
            :HISTORICO_STATUS
        DO
        BEGIN
            
            /* VERIFICA SE EH TEMPO PRODUTIVO */
            /* 0 - INICIADO/REINICIADO; 1 - PARADO; 2 - FINALIZADO */
            IF ( (STATUS_ANTERIOR = '0' AND HISTORICO_STATUS = '1') OR (STATUS_ANTERIOR = '0' AND HISTORICO_STATUS = '2') ) THEN
            BEGIN
                /* CALCULA O TEMPO PRODUTIVO E CONVERTE PARA FRACAO DE MINUTO */
                TEMPO_FRACAO_DIA      = (TEMPO_FRACAO_DIA + HISTORICO_DATAHORA - DATAHORA_ANTERIOR);
                O_TEMPO_FRACAO_MINUTO = TEMPO_FRACAO_DIA*24*60;
            END
    
            /* GUARDA A DATAHORA E O STATUS ATUAL, PARA SER UTILIZADO NO PROXIMO REGISTRO */
            DATAHORA_ANTERIOR = :HISTORICO_DATAHORA;
            STATUS_ANTERIOR   = :HISTORICO_STATUS;

        END

        SUSPEND;

end
^

SET TERM ; ^

