CREATE TABLE TBTURNO_PRODUCAO (
    ESTABELECIMENTO_CODIGO INTEGER NOT NULL,
    CODIGO INTEGER NOT NULL,
    DIA_SEMANA INTEGER NOT NULL,
    DESCRICAO VARCHAR(20),
    STATUS CHAR(1),
    STATUSEXCLUSAO CHAR(1),
    USUARIO_CODIGO INTEGER,
    DATA DATE DEFAULT 'NOW',
    HORA_INICIO TIME,
    HORA_FIM TIME);

ALTER TABLE TBTURNO_PRODUCAO
ADD CONSTRAINT PK_TBTURNO_PRODUCAO
PRIMARY KEY (ESTABELECIMENTO_CODIGO,CODIGO,DIA_SEMANA);

    COMPARE_HORA(p.hora_inicio,p.hora_fim,current_time)

from tbturno_producao p where
p.dia_semana = extract( WEEKDAY from current_date)

ALTER TABLE TBTURNO_PRODUCAO
    ADD TURNO_CORRENTE COMPUTED BY (iif(dia_semana = extract( WEEKDAY from current_date),COMPARE_HORA(hora_inicio,hora_fim,current_time),0));
	
ALTER TABLE TBTURNO_PRODUCAO
    ADD DATA_PRODUCAO COMPUTED BY ((IIF(
  TURNO_CORRENTE = '1',

CURRENT_DATE-((IIF(HORA_INICIO > HORA_FIM,1,0)) -
    IIF((
        IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
          <
        (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + CURRENT_TIME),1,0))
  ,
  NULL
)));

CREATE OR ALTER FUNCTION TEMPO_CORRIDO_UP (
    hora_inicio time,
    hora_fim time,
    up_id integer)
returns integer
as
declare variable flag varchar(1);
declare variable hora_inicio1 time;
declare variable hora_fim1 time;
declare variable hora_inicio2 time;
declare variable hora_fim2 time;
declare variable tempo_2 integer;
declare variable tempo_1 integer;
BEGIN
    TEMPO_1 = 0;
    TEMPO_2 = 0;

    if(HORA_INICIO < HORA_FIM)then
    begin
       hora_inicio1 = HORA_INICIO;
       hora_fim1    = HORA_FIM;

       if(current_time < HORA_INICIO or current_time > HORA_FIM)then
       begin
            TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_up(
                :up_id,
                :HORA_INICIO,
                :HORA_FIM))
            ,0);
       end else
       begin
            TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_up(
                :up_id,
                :HORA_INICIO,
                current_time
               ))
            ,0);
       end

    end
    else
    begin
        hora_inicio1 = HORA_INICIO;
        hora_fim1    = cast('23:59:59.999' as time);

        hora_inicio2 = cast('00:00:00' as time);
        hora_fim2    = HORA_FIM;

        if((current_time >= HORA_INICIO) or ((select first 1 j.data_producao from tbturno_producao j where j.data_producao is not null) <> current_date) )then
        begin
            if(hora_fim1 < cast('23:59:59.999' as time))then
            begin
                TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_up(
                    :up_id,
                    :hora_inicio1,
                    current_time))
                ,0);
    
            end else
            begin
                
                TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_up(
                    :up_id,
                    :hora_inicio1,
                    :hora_fim1))
                ,0);
    
                TEMPO_2 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_up(
                    :up_id,
                    :hora_inicio2,
                    current_time))
               ,0);
    
            end
        end


       TEMPO_1 = TEMPO_1 + TEMPO_2;
    end

    return  TEMPO_1;

END;

CREATE OR ALTER PROCEDURE SPC_CALENDARIO_UP (
    up_id integer,
    datahora_1 timestamp,
    datahora_2 timestamp)
returns (
    data date,
    hora time,
    datahora timestamp,
    produtivo char(1))
as
declare variable incremento_data date;
declare variable hora_inicio time;
declare variable hora_fim time;
BEGIN

    /* INICIALIZA A DATA */
    DATA = CAST(DATAHORA_1 AS DATE);

    /* INICIALIZA O LACO QUE VAI PASSAR POR TODOS OS DIAS ENTRE A DATAHORA_1 E DATAHORA_2 */
    WHILE ( (CAST(DATAHORA_2 AS DATE)+1) > DATA ) DO
    BEGIN

        /* INICIALIZA O LACO DE CONSULTA QUE VAI PASSAR EM TODOS OS MINUTOS DO DIA */
        /* OBS.: LIMITANDO O MINUTO MINIMO E MAXIMO PELO PARAMETRO DATAHORA_1 E DATAHORA_2 RESPECTIVAMENTE */
        FOR
            SELECT DATAHORA, HORA
            FROM (
                SELECT CAST(CAST(:DATA AS DATE)||' '||M.HORA AS TIMESTAMP) DATAHORA,
                       CAST(M.HORA AS TIME) HORA
                  FROM TBMINUTO M
                 ORDER BY M.HORA
            )X
            WHERE DATAHORA BETWEEN :DATAHORA_1 AND :DATAHORA_2

        INTO
            :DATAHORA,
            :HORA
        DO
        BEGIN
            
            /* POR PADRAO INICA QUE O MINUTO CORRENTE EH IMPRODUTIVO */
            PRODUTIVO = 0;

            /* INICIALIZA O LACO DE CONSULTA QUE VAI VERIFICAR SE O MINUTO EH PRODUTIVO */
            FOR
                SELECT FIRST 1 Z.INICIO, Z.FIM
                  FROM (
                    SELECT SUBSTRING(OSPLIT FROM 1 FOR 5) INICIO,
                           SUBSTRING(OSPLIT FROM 7 FOR 5) FIM
                      FROM SPLIT (
                        (SELECT C.HORARIO
                           FROM tbcalendario_up C
                          WHERE C.UP_ID = :UP_ID
                            AND C.DATA  = :DATA), ';')
                    ) Z
                 WHERE :HORA BETWEEN Z.INICIO AND Z.FIM
            INTO
                :HORA_INICIO,
                :HORA_FIM
            DO
            BEGIN
                /* ALCANCANDO ESTE BLOCO, INDICA QUE O MINUTO CORRENTE EH PRODUTIVO */
                PRODUTIVO = 1;
            END

        SUSPEND;
        END

        /* INCREMENTA MAIS UM DIA */
        DATA = DATA+1;
    END
END;

CREATE OR ALTER FUNCTION TEMPO_CORRIDO (
    hora_inicio time,
    hora_fim time,
    up_id integer,
    estacao_id integer)
returns integer
as
declare variable flag varchar(1);
declare variable hora_inicio1 time;
declare variable hora_fim1 time;
declare variable hora_inicio2 time;
declare variable hora_fim2 time;
declare variable tempo_2 integer;
declare variable tempo_1 integer;
BEGIN
    TEMPO_1 = 0;
    TEMPO_2 = 0;

    if(HORA_INICIO < HORA_FIM)then
    begin
       hora_inicio1 = HORA_INICIO;
       hora_fim1    = HORA_FIM;

       if(current_time < HORA_INICIO or current_time > HORA_FIM)then
       begin
            TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_estacao(
                :up_id,
                :estacao_id,
                :HORA_INICIO,
                :HORA_FIM))
            ,0);
       end else
       begin
            TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_estacao(
                :up_id,
                :estacao_id,
                :HORA_INICIO,
                current_time
               ))
            ,0);
       end

    end
    else
    begin
        hora_inicio1 = HORA_INICIO;
        hora_fim1    = cast('23:59:59.999' as time);

        hora_inicio2 = cast('00:00:00' as time);
        hora_fim2    = HORA_FIM;

        if(current_time >= HORA_INICIO)then
        begin
            if(hora_fim1 < cast('23:59:59.999' as time))then
            begin
                TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_estacao(
                    :up_id,
                    :estacao_id,
                    :hora_inicio1,
                    current_time))
                ,0);
    
            end else
            begin
                
                TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_estacao(
                    :up_id,
                    :estacao_id,
                    :hora_inicio1,
                    :hora_fim1))
                ,0);
    
                TEMPO_2 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_estacao(
                    :up_id,
                    :estacao_id,
                    :hora_inicio2,
                    current_time))
               ,0);
    
            end
        end


       TEMPO_1 = TEMPO_1 + TEMPO_2;
    end

    return  TEMPO_1;

END;

CREATE OR ALTER FUNCTION TEMPO_DISPONIVEL (
    hora_inicio time,
    hora_fim time,
    up_id integer,
    estacao_id integer)
returns integer
as
declare variable flag varchar(1);
declare variable hora_inicio1 time;
declare variable hora_fim1 time;
declare variable hora_inicio2 time;
declare variable hora_fim2 time;
declare variable tempo_2 integer;
declare variable tempo_1 integer;
BEGIN
    TEMPO_1 = 0;
    TEMPO_2 = 0;

    if(HORA_INICIO < HORA_FIM)then
    begin
        hora_inicio1 = HORA_INICIO;
        hora_fim1    = HORA_FIM;

        TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_estacao(
                :up_id,
                :estacao_id,
                :HORA_INICIO,
                :HORA_FIM))

       ,0);

    end
    else
    begin
        hora_inicio1 = HORA_INICIO;
        hora_fim1    = cast('23:59:59.999' as time);

        TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_estacao(
                :up_id,
                :estacao_id,
                :hora_inicio1,
                :hora_fim1))

       ,0);

        hora_inicio2 = cast('00:00:00' as time);
        hora_fim2    = HORA_FIM;

        TEMPO_2 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_estacao(
                :up_id,
                :estacao_id,
                :hora_inicio2,
                :hora_fim2))

       ,0);

       TEMPO_1 = TEMPO_1 + TEMPO_2;
    end

    return  TEMPO_1;
END;

CREATE OR ALTER FUNCTION TEMPO_DISPONIVEL_UP (
    hora_inicio time,
    hora_fim time,
    up_id integer)
returns integer
as
declare variable flag varchar(1);
declare variable hora_inicio1 time;
declare variable hora_fim1 time;
declare variable hora_inicio2 time;
declare variable hora_fim2 time;
declare variable tempo_2 integer;
declare variable tempo_1 integer;
BEGIN
    TEMPO_1 = 0;
    TEMPO_2 = 0;

    if(HORA_INICIO < HORA_FIM)then
    begin
        hora_inicio1 = HORA_INICIO;
        hora_fim1    = HORA_FIM;

        TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_up(
                :up_id,
                :HORA_INICIO,
                :HORA_FIM))

       ,0);

    end
    else
    begin
        hora_inicio1 = HORA_INICIO;
        hora_fim1    = cast('23:59:59.999' as time);

        TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_up(
                :up_id,
                :hora_inicio1,
                :hora_fim1))

       ,0);

        hora_inicio2 = cast('00:00:00' as time);
        hora_fim2    = HORA_FIM;

        TEMPO_2 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_up(
                :up_id,
                :hora_inicio2,
                :hora_fim2))

       ,0);

       TEMPO_1 = TEMPO_1 + TEMPO_2;
    end

    return  TEMPO_1;

END;

CREATE OR ALTER VIEW VWREGISTRO_DEFEITO_DIA(
    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    QUANTIDADE,
    QTD_TURNO1,
    QTD_TURNO2,
    TALOES,
    DEFEITO_ID,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    FAMILIA_ID,
    ESTABELECIMENTO_ID,
    tamanho,
    Densidade)
AS
select

    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    sum(Quantidade) as Quantidade,
    sum(QTD_TURNO1) as QTD_TURNO1,
    sum(QTD_TURNO2) as QTD_TURNO2,
    sum(TALOES) as TALOES,
    defeito_id,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    familia_id,
    estabelecimento_id,
    tamanho,
    Densidade

from(
    Select
        
        B.Data DATA_REGISTRO,
        d.descricao as DEFEITO,
        d.setor as SETOR,
        m.descricao as MODELO,
        p.descricao as PRODUTO,
        c.descricao as COR,
        e.descricao as GP,
        r.descricao as LINHA,
        s.descricao as PERFIL,
    
        B.Quantidade,
        IIF(B.TURNO=1,B.Quantidade,0) QTD_TURNO1,
        IIF(B.TURNO=2,B.Quantidade,0) QTD_TURNO2,
        1 as TALOES,
    
        d.codigo as defeito_id,
        m.codigo as modelo_id,
        p.codigo as produto_id,
        c.codigo cor_id,
        e.codigo gp_id,
        r.codigo linha_id,
        s.id perfil_id,

        p.familia_codigo as familia_id,
        b.estabelecimento_id,

        b.tamanho,

        (Select First 1
      Coalesce((Select First 1 M.Densidade
         From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000')
      From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
     Where MC.Modelo_Id = p.modelo_codigo
       and MC.Cor_Id = c.codigo
       and MC.Produto_Id = P2.Codigo
       and P2.Familia_Codigo = F.Codigo
       and F.Densidade_Espessura = '1'

       and((b.tamanho = 1 and MC.T01 > 0) or
           (b.Tamanho = 2 and MC.T02 > 0) or
           (b.Tamanho = 3 and MC.T03 > 0) or
           (b.Tamanho = 4 and MC.T04 > 0) or
           (b.Tamanho = 5 and MC.T05 > 0) or
           (b.Tamanho = 6 and MC.T06 > 0) or
           (b.Tamanho = 7 and MC.T07 > 0) or
           (b.Tamanho = 8 and MC.T08 > 0) or
           (b.Tamanho = 9 and MC.T09 > 0) or
           (b.Tamanho =10 and MC.T10 > 0) or
           (b.Tamanho =11 and MC.T11 > 0) or
           (b.Tamanho =12 and MC.T12 > 0) or
           (b.Tamanho =13 and MC.T13 > 0) or
           (b.Tamanho =14 and MC.T14 > 0) or
           (b.Tamanho =15 and MC.T15 > 0) or
           (b.Tamanho =16 and MC.T16 > 0) or
           (b.Tamanho =17 and MC.T17 > 0) or
           (b.Tamanho =18 and MC.T18 > 0) or
           (b.Tamanho =19 and MC.T19 > 0) or
           (b.Tamanho =20 and MC.T20 > 0))) as Densidade
    
    From TbDefeito_Transacao_Item B,tbsac_defeito d, TbEsteira E, TbProduto P, tbmodelo M, tbcor c,tbmodelo_linha r,tbperfil s
    Where B.Esteira_id = E.Codigo
      and B.Produto_id = P.Codigo
      --and B.Estabelecimento_Id = :ESTABELECIMENTO
      --and B.Data between :DATA1 and :DATA2
      AND (B.DEFEITO_ID > 0)
      --and P.Familia_Codigo = :FAMILIA
      and m.codigo = p.modelo_codigo
      and d.codigo = b.defeito_id
      and c.codigo = p.cor_codigo
      and r.codigo = m.linha_codigo
      and s.id = b.perfil
      and s.tabela = 'SKU'
      and s.familia_id = p.familia_codigo

)

        group by
        DATA_REGISTRO,
        DEFEITO,
        MODELO,
        PRODUTO,
        COR,
        GP,
        LINHA,
        PERFIL,
        defeito_id,
        MODELO_ID,
        PRODUTO_ID,
        COR_ID,
        GP_ID,
        LINHA_ID,
        PERFIL_ID,
        familia_id,
        estabelecimento_id,
        tamanho,
        Densidade
;

CREATE OR ALTER VIEW VWREGISTRO_PRODUCAO_DIA(
    DATA_REGISTRO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    QUANTIDADE,
    QTD_TURNO1,
    QTD_TURNO2,
    TALOES,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    FAMILIA_ID,
    ESTABELECIMENTO_ID,
    tamanho,
    Densidade)
AS
select

    DATA_REGISTRO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    sum(QUANTIDADE_PEDIDO) as QUANTIDADE,
    sum(QTD_TURNO1) as QTD_TURNO1,
    sum(QTD_TURNO2) as QTD_TURNO2,
    sum(TALOES) as TALOES,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    familia_id,
    estabelecimento_id,
    tamanho,
    Densidade

from(

    select
    
        A.Data_Producao as DATA_REGISTRO,
        A.pedido_item_controle as ID,
        
        m.descricao as MODELO,
        p.descricao as PRODUTO,
        c.descricao as COR,
        e.descricao as GP,
        r.descricao as LINHA,
        s.descricao as PERFIL,
        
        A.QUANTIDADE_PEDIDO,
        IIF(A.TURNO=1,A.QUANTIDADE_PEDIDO,0) QTD_TURNO1,
        IIF(A.TURNO=2,A.QUANTIDADE_PEDIDO,0) QTD_TURNO2,
        1 as TALOES,
        
        m.codigo as modelo_id,
        p.codigo as produto_id,
        c.codigo cor_id,
        e.codigo gp_id,
        r.codigo linha_id,
        s.id perfil_id,
        a.familia_codigo as familia_id,
        a.estabelecimento_codigo as estabelecimento_id,
        a.tamanho,

        (Select First 1
      Coalesce((Select First 1 M.Densidade
         From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000')
      From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
     Where MC.Modelo_Id = p.modelo_codigo
       and MC.Cor_Id = c.codigo
       and MC.Produto_Id = P2.Codigo
       and P2.Familia_Codigo = F.Codigo
       and F.Densidade_Espessura = '1'

       and((a.tamanho = 1 and MC.T01 > 0) or
           (a.Tamanho = 2 and MC.T02 > 0) or
           (a.Tamanho = 3 and MC.T03 > 0) or
           (a.Tamanho = 4 and MC.T04 > 0) or
           (a.Tamanho = 5 and MC.T05 > 0) or
           (a.Tamanho = 6 and MC.T06 > 0) or
           (a.Tamanho = 7 and MC.T07 > 0) or
           (a.Tamanho = 8 and MC.T08 > 0) or
           (a.Tamanho = 9 and MC.T09 > 0) or
           (a.Tamanho =10 and MC.T10 > 0) or
           (a.Tamanho =11 and MC.T11 > 0) or
           (a.Tamanho =12 and MC.T12 > 0) or
           (a.Tamanho =13 and MC.T13 > 0) or
           (a.Tamanho =14 and MC.T14 > 0) or
           (a.Tamanho =15 and MC.T15 > 0) or
           (a.Tamanho =16 and MC.T16 > 0) or
           (a.Tamanho =17 and MC.T17 > 0) or
           (a.Tamanho =18 and MC.T18 > 0) or
           (a.Tamanho =19 and MC.T19 > 0) or
           (a.Tamanho =20 and MC.T20 > 0))) as Densidade
    
    From TbPedido_Item_Processado A, TbEsteira E, TbProduto P, tbmodelo M, tbcor c,tbmodelo_linha r,tbperfil s
    
        where 1 = 1
        --and A.Estabelecimento_Codigo = :ESTABELECIMENTO
        --and A.Data_Producao between :DATA1 and :DATA2
        --and A.familia_codigo = :FAMILIA
        
        and e.codigo = a.Esteira_Producao
        and p.codigo = a.produto_codigo
        and m.codigo = p.modelo_codigo
        and c.codigo = p.cor_codigo
        and r.codigo = m.linha_codigo
        and s.id = a.perfil
        and s.tabela = 'SKU'

)

        group by
        DATA_REGISTRO,
        MODELO,
        PRODUTO,
        COR,
        GP,
        LINHA,
        PERFIL,
        MODELO_ID,
        PRODUTO_ID,
        COR_ID,
        GP_ID,
        LINHA_ID,
        PERFIL_ID,
        familia_id,
        estabelecimento_id,
        tamanho,
        Densidade
;




