CREATE OR ALTER PROCEDURE SPU_RASTREAMENTO_VINCULO (
    I_REMESSA_ID INTEGER,
    I_REMESSA_TALAO_ID INTEGER,
    I_REMESSA_TALAO_DETALHE_ID INTEGER,
    I_NIVEL INTEGER)
RETURNS (
    CONSUMO_ID INTEGER,
    PRODUTO_ID INTEGER,
    REMESSA_ID INTEGER,
    REMESSA_TALAO_ID INTEGER,
    REMESSA_TALAO_DETALHE_ID INTEGER,
    TABELA_ID INTEGER,
    TIPO VARCHAR(10),
    NIVEL INTEGER)
AS
DECLARE VARIABLE V_ID INTEGER;
DECLARE VARIABLE V_PRODUTO_ID INTEGER;
DECLARE VARIABLE V_REMESSA_ID INTEGER;
DECLARE VARIABLE V_REMESSA_TALAO_ID INTEGER;
BEGIN

    FOR

        SELECT
            C.ID,
            C.PRODUTO_ID
        FROM
            VWREMESSA_CONSUMO C
        WHERE
            C.REMESSA_ID = :I_REMESSA_ID
            AND C.REMESSA_TALAO_ID = :I_REMESSA_TALAO_ID
            AND (IIF(:I_NIVEL > 0,C.REMESSA_TALAO_DETALHE_ID = :I_REMESSA_TALAO_DETALHE_ID,TRUE) OR (C.REMESSA_TALAO_DETALHE_ID = 0) )

    INTO
       :CONSUMO_ID,
       :PRODUTO_ID
    DO
    BEGIN
        :NIVEL     = :I_NIVEL;
        :TABELA_ID = 1;
        :TIPO      = '';

        FOR
    
            SELECT
            
                V.REMESSA_ID,
                V.REMESSA_TALAO_ID,
                V.REMESSA_TALAO_DETALHE_ID
            
            FROM
                TBREMESSA_CONSUMO_VINCULO V
            
            WHERE V.CONSUMO_ID = :CONSUMO_ID
    
        INTO
            :REMESSA_ID,
            :REMESSA_TALAO_ID,
            :REMESSA_TALAO_DETALHE_ID
        DO
        BEGIN

            IF(:NIVEL=0)THEN
            BEGIN
                :TABELA_ID = :REMESSA_TALAO_DETALHE_ID;
                :TIPO      = '';
            END ELSE
            BEGIN
                :TABELA_ID = 0;
                :TIPO      = '';
            END
            SUSPEND;

            FOR
                SELECT * FROM SPU_RASTREAMENTO_VINCULO(:REMESSA_ID,:REMESSA_TALAO_ID,:REMESSA_TALAO_DETALHE_ID,:I_NIVEL+1)
            INTO
                :CONSUMO_ID,
                :PRODUTO_ID,
                :REMESSA_ID,
                :REMESSA_TALAO_ID,
                :REMESSA_TALAO_DETALHE_ID,
                :TABELA_ID,
                :TIPO,
                :NIVEL
            DO
            BEGIN
                IF(:REMESSA_ID IS NULL)THEN
                BEGIN
                    FOR
                        SELECT
                           S.TABELA_ID,
                           S.TIPO
                        FROM TBREMESSA_TALAO_VINCULO S WHERE S.CONSUMO_ID =: CONSUMO_ID
                    INTO
                        :TABELA_ID,
                        :TIPO
                    DO
                    BEGIN

                    END

                END
                SUSPEND;
            END

        END

       :TABELA_ID = 0;
       :TIPO      = '';
       SUSPEND;

    END

END;


CREATE OR ALTER PROCEDURE SPU_RASTREAMENTO_CONSUMO (
    I_REMESSA_ID INTEGER,
    I_REMESSA_TALAO_ID INTEGER)
RETURNS (
    DESCRICAO VARCHAR(100),
    CONSUMO_ID INTEGER,
    PRODUTO_ID INTEGER,
    REMESSA_ID VARCHAR(10),
    REMESSA_TALAO_ID INTEGER,
    REMESSA_TALAO_DETALHE_ID INTEGER,
    TABELA_ID INTEGER,
    TIPO VARCHAR(10),
    NIVEL INTEGER,
    DATA_PRODUCAO TIMESTAMP)
AS
DECLARE VARIABLE V_ID INTEGER;
DECLARE VARIABLE V_PRODUTO_ID INTEGER;
DECLARE VARIABLE V_REMESSA_ID INTEGER;
DECLARE VARIABLE V_REMESSA_TALAO_ID INTEGER;
BEGIN

    FOR

        SELECT DISTINCT
            P.DESCRICAO,
            D.*
        
        FROM SPU_RASTREAMENTO_VINCULO(:I_REMESSA_ID,:I_REMESSA_TALAO_ID,0,0) D, TBPRODUTO P
        
        WHERE 1 = 1
            AND P.CODIGO = D.PRODUTO_ID
            AND D.NIVEL < 2
            ORDER BY D.NIVEL,P.DESCRICAO

    INTO
        :DESCRICAO,
        :CONSUMO_ID,
        :PRODUTO_ID,
        :REMESSA_ID,
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :TABELA_ID,
        :TIPO,
        :NIVEL
    DO
    BEGIN


       FOR
            SELECT
                K.DATAHORA_PRODUCAO,
                R.REMESSA,
                K.REMESSA_TALAO_ID
            FROM VWREMESSA_TALAO_DETALHE K, TBREMESSA R
            WHERE 1 = 1
            AND K.ID = IIF( :REMESSA_TALAO_DETALHE_ID IS NULL,:TABELA_ID, :REMESSA_TALAO_DETALHE_ID)
            AND R.NUMERO = K.REMESSA_ID

        INTO
            :DATA_PRODUCAO,
            :REMESSA_ID,
            :REMESSA_TALAO_ID
        DO
        BEGIN
            :REMESSA_TALAO_DETALHE_ID = IIF( :REMESSA_TALAO_DETALHE_ID IS NULL,:TABELA_ID, :REMESSA_TALAO_DETALHE_ID);
            SUSPEND;

            FOR
                SELECT
                    D.PRODUTO_ID,
                    D.REMESSA_ID,
                    D.REMESSA_TALAO_ID,
                    D.DATAHORA_PRODUCAO
                
                FROM TBREMESSA_CONSUMO C, TBREMESSA_TALAO_VINCULO V, VWREMESSA_TALAO_DETALHE D
                WHERE 1=1
                
                AND C.TALAO_DETALHE_ID = :REMESSA_TALAO_DETALHE_ID
                AND V.CONSUMO_ID = C.ID
                AND D.ID = V.TABELA_ID
                AND V.TIPO = :TIPO
            INTO
                :PRODUTO_ID,
                :REMESSA_ID,
                :REMESSA_TALAO_ID,
                :DATA_PRODUCAO
            DO
            BEGIN
                :DESCRICAO = (SELECT FIRST 1 P.DESCRICAO FROM TBPRODUTO P WHERE P.CODIGO = :PRODUTO_ID);

                :CONSUMO_ID = NULL;
                :REMESSA_TALAO_DETALHE_ID  = NULL;
                :TABELA_ID = NULL;
                :TIPO  = NULL;
                :NIVEL = 4;

                SUSPEND;
            END

        END
    END
END;

COMMENT ON PROCEDURE SPU_RASTREAMENTO_VINCULO IS 'CONSULTA IERARQUIA DE CONSUMOS DE UMA REMESSA TALAO, EX: TODOS OS CONSUMOS DO VINCULADOS DO TALAO DO BOJO ATE O TECIDO';

COMMENT ON PROCEDURE SPU_RASTREAMENTO_CONSUMO IS 'CONSULTA OS COMPONENTES E MATERIAS PRIMAS DE UM TALAO E REMESSA, EX: TODOS OS COMPONETES USADOS EM UMA REMESSA';

CREATE TRIGGER TBREGISTRO_PARADA_BI0 FOR TBREGISTRO_PARADA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE ID INT;
BEGIN
  IF(NEW.STATUS > 0)THEN
  BEGIN
    FOR
        SELECT P.ID FROM TBPROGRAMACAO P
    
        WHERE 1 = 1
        AND P.GP_ID   = NEW.VINCULO_ID
        AND P.UP_ID   = NEW.SUBVINCULO_ID
        AND P.ESTACAO = NEW.TABELA_ID
        AND P.STATUS  = 2
    
    INTO :ID
    DO
    BEGIN
    UPDATE TBPROGRAMACAO SET STATUS = 1 WHERE ID = :ID;
    INSERT INTO TBPROGRAMACAO_REGISTRO (PROGRAMACAO_ID, DATAHORA, STATUS, OPERADOR_ID, JUSTIFICATIVA_ID)
        VALUES (:ID, CURRENT_TIMESTAMP, 1 , NEW.OPERADOR_ID, 1);
    END
  END
END;

ALTER TABLE TBPROGRAMACAO
    ADD STATUS_REQUISICAO INTEGER;

COMMENT ON COLUMN TBPROGRAMACAO.STATUS_REQUISICAO IS
'0- NÃO ESTA ESPERANDO EQUISICAO 1-ESTA AGUARDANDO UMA REQUISICAO';

ALTER TABLE TBPROGRAMACAO ALTER COLUMN STATUS_REQUISICAO
SET DEFAULT 0
;

CREATE TRIGGER TBREQUISICAO_B3I_01 FOR TBREQUISICAO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE PROGRAMACAO_ID INTEGER;
BEGIN

  FOR
     SELECT
         FIRST 1
         P.ID
     FROM TBPROGRAMACAO P
     WHERE 1 = 1
     AND P.GP_ID = NEW.GP_ID
     AND P.REMESSA_ID = NEW.REMESSA
     AND P.PRODUTO_ID = NEW.PRODUTO_ID
     AND P.TAMANHO = NEW.TAMANHO

     ORDER BY P.DATAHORA_FIM DESC
  INTO
    :PROGRAMACAO_ID
  DO
  BEGIN
    UPDATE TBPROGRAMACAO P SET P.STATUS = 1, P.STATUS_REQUISICAO = 1 WHERE P.ID = :PROGRAMACAO_ID;
  END

END;

COMMENT ON TRIGGER TBREQUISICAO_B3I_01 IS 'MARCA UM TALAO COMO AGUARDANDO REQUISICAO, TBPROGRAMACAO.STATUS_REQUISICAO = 1';

CREATE OR ALTER TRIGGER TBREQUISICAO_B3I_01 FOR TBREQUISICAO
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE PROGRAMACAO_ID INTEGER;
DECLARE VARIABLE STATUS INTEGER;
DECLARE VARIABLE LINHA INTEGER;
BEGIN

  FOR
     SELECT
         P.ID,
         P.STATUS,
         ROW_NUMBER() OVER (ORDER BY P.DATAHORA_FIM DESC) AS LINHA
     FROM TBPROGRAMACAO P
     WHERE 1 = 1
     AND P.GP_ID = NEW.GP_ID
     AND P.REMESSA_ID = NEW.REMESSA
     AND P.PRODUTO_ID = NEW.PRODUTO_ID
     AND P.TAMANHO = NEW.TAMANHO

     ORDER BY P.DATAHORA_FIM DESC
  INTO
    :PROGRAMACAO_ID,
    :STATUS,
    :LINHA
  DO
  BEGIN

    --NAO PERMITE REGISTRAR REQUISICAO SE SKU EM ABERTO NA REMESSA
    IF(:STATUS < 3)THEN
    BEGIN
        EXCEPTION "..." 'REQUISICAO NAO PERMITIDA, HA TALOES DESTE SKU EM ABERTO CONFORMACAO, REMESSA:'||:NEW.REMESSA||' GP:'||NEW.GP_ID||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
    END

    --MARCA O PRIMEIRO GEGISTRO COMO AGUARDANDO REQUISICAO
    IF(:LINHA = 1)THEN
    BEGIN
        UPDATE TBPROGRAMACAO P SET P.STATUS = 1, P.STATUS_REQUISICAO = 1 WHERE P.ID = :PROGRAMACAO_ID;
    END

  END

END;





