SET TERM ^ ;

CREATE OR ALTER procedure SPU_PRODUTO_CONSUMO_NEW (
    PRD1 integer,
    PRD2 integer,
    MOD1 integer,
    MOD2 integer,
    LIN1 integer,
    LIN2 integer,
    USUARIO integer,
    IP varchar(30),
    VERSAO varchar(20))
returns (
    MODELO_ID integer,
    PRODUTO_ID1 integer,
    PRODUTO_ID2 integer)
as
declare variable GRUPO_PRODUTO_ID integer;
BEGIN
    FOR
        SELECT
            A.CODIGO,
    
            COALESCE((SELECT FIRST 1
                    B.CONSUMO_PRODUTO_CODIGO
                FROM TBMODELO_CONSUMO B
                WHERE B.MODELO_CODIGO = A.CODIGO
                AND B.CONSUMO_PRODUTO_CODIGO = :PRD1), 0),
    
            COALESCE((SELECT FIRST 1
                    B.CONSUMO_PRODUTO_CODIGO
                FROM TBMODELO_CONSUMO B
                WHERE B.MODELO_CODIGO = A.CODIGO
                AND B.CONSUMO_PRODUTO_CODIGO = :PRD2), 0),

           coalesce((select FIRST 1
                        p.grupo_produto_id
           from tbproduto p
           where p.codigo = :PRD2),0) as GRUPO_PRODUTO_ID
    
        FROM TBMODELO A
        WHERE A.CODIGO BETWEEN :MOD1 AND :MOD2
        AND A.LINHA_CODIGO BETWEEN :LIN1 AND :LIN2
        AND A.STATUS = 1
    
        GROUP BY 1
        HAVING
            COALESCE((SELECT FIRST 1 B.CONSUMO_PRODUTO_CODIGO FROM TBMODELO_CONSUMO B
                WHERE B.MODELO_CODIGO = A.CODIGO AND B.CONSUMO_PRODUTO_CODIGO = :PRD1), 0) > 0
    
    INTO
        :MODELO_ID,
        :PRODUTO_ID1,
        :PRODUTO_ID2,
        :GRUPO_PRODUTO_ID
    DO
    begin
        IF (:MODELO_ID > 0) THEN
        BEGIN
            UPDATE TBMODELO_CONSUMO
                SET CONSUMO_PRODUTO_CODIGO = :PRD2
                WHERE MODELO_CODIGO = :MODELO_ID
                AND CONSUMO_PRODUTO_CODIGO = :PRD1;
            
            INSERT INTO TBHISTORICO (TABELA, TABELA_ID,USUARIO_CODIGO, IP, VERSAO, HISTORICO)
                VALUES ('TBMODELO', :MODELO_ID, :USUARIO, :IP, :VERSAO, 'PROD.CONS.ALTERADO: '||:PRD1||'->'||:PRD2);
        END
        SUSPEND;
    end

    FOR
        SELECT
            A.CODIGO,
            COALESCE((SELECT FIRST 1
                    B.PRODUTO_ID
                FROM TBMODELO_CONSUMO_COR B
                WHERE B.MODELO_ID = A.CODIGO
                AND B.PRODUTO_ID = :PRD1), 0) AS PRODUTO_ID1,
        
            COALESCE((SELECT FIRST 1
                    B.PRODUTO_ID
                FROM TBMODELO_CONSUMO_COR B
                WHERE B.MODELO_ID = A.CODIGO
                AND B.PRODUTO_ID = :PRD2), 0) AS PRODUTO_ID2,

           coalesce((select FIRST 1
                        p.grupo_produto_id
           from tbproduto p
           where p.codigo = :PRD2),0) as GRUPO_PRODUTO_ID
        
        FROM TBMODELO A
        WHERE A.CODIGO BETWEEN :MOD1 AND :MOD2
        AND A.LINHA_CODIGO BETWEEN :LIN1 AND :LIN2
        AND A.STATUS = 1
        
        GROUP BY 1
        HAVING
            COALESCE((SELECT FIRST 1 B.PRODUTO_ID FROM TBMODELO_CONSUMO_COR B WHERE B.MODELO_ID = A.CODIGO AND B.PRODUTO_ID = :PRD1), 0) > 0
    

    INTO
        :MODELO_ID,
        :PRODUTO_ID1,
        :PRODUTO_ID2,
        :GRUPO_PRODUTO_ID
     DO begin

        IF (:MODELO_ID > 0) THEN
        BEGIN
            UPDATE TBMODELO_CONSUMO_COR
                SET PRODUTO_ID = :PRD2,
                GRUPO_PRODUTO_ID = coalesce(:GRUPO_PRODUTO_ID,0)
                WHERE MODELO_ID = :MODELO_ID
                AND PRODUTO_ID = :PRD1;
            
            INSERT INTO TBHISTORICO (TABELA, TABELA_ID,USUARIO_CODIGO, IP, VERSAO, HISTORICO)
                VALUES ('TBMODELO', :MODELO_ID, :USUARIO, :IP, :VERSAO, 'PROD.CONS.ALTERADO: '||:PRD1||'->'||:PRD2);
        END
        
        SUSPEND;
   end
END
^

SET TERM ; ^

