SET TERM ^ ;

CREATE OR ALTER function FN_EMPENHADO_PEDIDO2 (
    ESTABELECIMENTO_ID integer,
    LOCALIZACAO_ID integer,
    PRODUTO_ID integer,
    TAMANHO integer)
returns numeric(18,8)
AS
declare variable RET numeric(18,8);
begin

  ret = coalesce((
            select
                 sum(iif(i.tamanho = 1, s.t01,
                 iif(i.tamanho = 2, s.t02,
                 iif(i.tamanho = 3, s.t03,
                 iif(i.tamanho = 4, s.t04,
                 iif(i.tamanho = 5, s.t05,
                 iif(i.tamanho = 6, s.t06,
                 iif(i.tamanho = 7, s.t07,
                 iif(i.tamanho = 8, s.t08,
                 iif(i.tamanho = 9, s.t09,
                 iif(i.tamanho =10, s.t10,
                 iif(i.tamanho =11, s.t01,
                 iif(i.tamanho =12, s.t02,
                 iif(i.tamanho =13, s.t03,
                 iif(i.tamanho =14, s.t04,
                 iif(i.tamanho =15, s.t05,
                 iif(i.tamanho =16, s.t06,
                 iif(i.tamanho =17, s.t07,
                 iif(i.tamanho =18, s.t08,
                 iif(i.tamanho =19, s.t09,
                 iif(i.tamanho =20, s.t10, 0))))))))))))))))))))) as SALDO
            from tbpedido_item i, tbpedido_item_saldo s
            where i.estabelecimento_codigo = :ESTABELECIMENTO_ID
            and i.localizacao_id = :LOCALIZACAO_ID
            and i.produto_codigo = :PRODUTO_ID
            and i.tamanho = :TAMANHO
            and i.pedido = s.pedido
            and s.pedido_item_controle = i.controle
            and  iif(i.tamanho = 1, s.t01 > 0,
                 iif(i.tamanho = 2, s.t02 > 0,
                 iif(i.tamanho = 3, s.t03 > 0,
                 iif(i.tamanho = 4, s.t04 > 0,
                 iif(i.tamanho = 5, s.t05 > 0,
                 iif(i.tamanho = 6, s.t06 > 0,
                 iif(i.tamanho = 7, s.t07 > 0,
                 iif(i.tamanho = 8, s.t08 > 0,
                 iif(i.tamanho = 9, s.t09 > 0,
                 iif(i.tamanho =10, s.t10 > 0,
                 iif(i.tamanho =11, s.t01 > 0,
                 iif(i.tamanho =12, s.t02 > 0,
                 iif(i.tamanho =13, s.t03 > 0,
                 iif(i.tamanho =14, s.t04 > 0,
                 iif(i.tamanho =15, s.t05 > 0,
                 iif(i.tamanho =16, s.t06 > 0,
                 iif(i.tamanho =17, s.t07 > 0,
                 iif(i.tamanho =18, s.t08 > 0,
                 iif(i.tamanho =19, s.t09 > 0,
                 iif(i.tamanho =20, s.t10 > 0, false))))))))))))))))))))
            --and i.qtd_est = 0
            and i.situacao = 1
            and s.quantidade > 0
          ),0);

  return ret;
end
^

SET TERM ; ^

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

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_ID1 integer;
declare variable GRUPO_PRODUTO_ID2 integer;
declare variable AGRUPAMENTO_ID1 integer;
declare variable AGRUPAMENTO_ID2 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)
    
        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

    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
            X.CODIGO,

            X.PRODUTO_ID1,
            X.GRUPO_PRODUTO_ID1,
            X.INC_GRUPO_PRODUTO1,

            X.PRODUTO_ID2,
            COALESCE((SELECT FIRST 1 C.GRUPO_PRODUTO_ID FROM TBPRODUTO C WHERE C.CODIGO = :PRD2), 0) AS GRUPO_PRODUTO_ID2,
            CAST(GEN_ID(GEN_AGRUPAMENTO_ID, 1) AS INTEGER) AS AGRUPAMENTO_ID2

        FROM (
            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.GRUPO_PRODUTO_ID
                    FROM TBMODELO_CONSUMO_COR B
                    WHERE B.MODELO_ID = A.CODIGO
                    AND B.PRODUTO_ID = :PRD1), 0) AS GRUPO_PRODUTO_ID1,
                COALESCE((SELECT FIRST 1
                        B.INC_GRUPO_PRODUTO
                    FROM TBMODELO_CONSUMO_COR B
                    WHERE B.MODELO_ID = A.CODIGO
                    AND B.PRODUTO_ID = :PRD1), 0) AS INC_GRUPO_PRODUTO1,
            
                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
            
            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
        ) X

    INTO
        :MODELO_ID,
        :PRODUTO_ID1,
        :GRUPO_PRODUTO_ID1,
        :AGRUPAMENTO_ID1,
        :PRODUTO_ID2,
        :GRUPO_PRODUTO_ID2,
        :AGRUPAMENTO_ID2
     DO begin

        IF (:MODELO_ID > 0) THEN
        BEGIN

--            EXCEPTION "..." 'MOD:'|| :MODELO_ID ||' | DADOS OLD => PROD:'|| :PRD1 ||', GRUP.PROD:'|| :GRUPO_PRODUTO_ID1 ||', AGRUP:'|| :AGRUPAMENTO_ID1 ||' | DADOS NEW => PROD:'|| :PRD2 ||', GRUP.PROD:'|| :GRUPO_PRODUTO_ID2 ||', AGRUP:'|| :AGRUPAMENTO_ID2;

            --------------------------------------------------------------------

            IF (:GRUPO_PRODUTO_ID1 = :GRUPO_PRODUTO_ID2) THEN
            BEGIN

                UPDATE TBMODELO_CONSUMO_COR
                    SET PRODUTO_ID = :PRD2,
                        GRUPO_PRODUTO_ID = :GRUPO_PRODUTO_ID2,
                        AGRUPAMENTO_ID = :AGRUPAMENTO_ID2,
                        INC_GRUPO_PRODUTO = IIF(NIVEL > 0, 0, 1)
                    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./GRUP.PROD./AGRUP. ALTERADO: '||:PRD1||'->'||:PRD2||'/'||:GRUPO_PRODUTO_ID1||'->'||:GRUPO_PRODUTO_ID2||'/'||:AGRUPAMENTO_ID1||'->'||:AGRUPAMENTO_ID2);

            END ELSE
            IF (:GRUPO_PRODUTO_ID1 <> :GRUPO_PRODUTO_ID2) THEN
            BEGIN

                UPDATE TBMODELO_CONSUMO_COR
                    SET PRODUTO_ID = :PRD2,
                        GRUPO_PRODUTO_ID = IIF(NIVEL > 0, 0, :GRUPO_PRODUTO_ID2),
                        AGRUPAMENTO_ID = :AGRUPAMENTO_ID2,
                        INC_GRUPO_PRODUTO = IIF(NIVEL > 0, 0, IIF(:GRUPO_PRODUTO_ID2 > 0, 1, 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./GRUP.PROD./AGRUP. ALTERADO: '||:PRD1||'->'||:PRD2||'/'||:GRUPO_PRODUTO_ID1||'->'||:GRUPO_PRODUTO_ID2||'/'||:AGRUPAMENTO_ID1||'->'||:AGRUPAMENTO_ID2);

            END

        END
        
        SUSPEND;
   end
END
^

SET TERM ; ^

