UPDATE OR INSERT INTO TBPARAMETRO (TABELA, CONTROLE, CODIGO, DESCRICAO, VALOR, OBSERVACAO, GRUPO, DATAHORA, USUARIO_ID)
                           VALUES ('SISTEMA', 1081, 'EMAIL_BAIXA_RESIDUOS', 'EMAIL NOTIFICAR BAIXA DE RESIDUOS', 'anderson@delfa.com.br', 'EMAIL NOTIFICAR BAIXA DE RESIDUOS', '', '2021-10-11 14:14:47', 186)
                         MATCHING (TABELA, CONTROLE);
						 
						 
						 
SET TERM ^ ;

CREATE OR ALTER procedure SP_BAIXA_RESIDUO_REMESSA (
    DATA_INICIO date,
    DATA_FIM date)
returns (
    EMAIL_ENVIADO integer,
    ECORPO blob sub_type 1 segment size 80)
as
declare variable ID_ESTOQUE_RESIDUO integer;
declare variable PRODUTO_CODIGO integer;
declare variable TAMANHO integer;
declare variable REMESSA_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable TALAO_ID integer;
declare variable CONTROLE integer;
declare variable REMESSA varchar(60);
declare variable GP_ID integer;
declare variable SALDO numeric(18,5);
declare variable PRODUCAO numeric(18,5);
declare variable USADO numeric(18,4);
declare variable DATA_PRODUCAO date;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID integer;
declare variable CCUSTO varchar(20);
declare variable CORPO blob sub_type 1 segment size 80;
declare variable EMAIL varchar(300);
begin
    CORPO = '';

    --baixa de residuos de tecido
    for
        select
            39 FAMILIA_ID,
            PERFIL_UP,
            PRODUTO_CODIGO,
            TAMANHO,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            TALAO_ID,
            CONTROLE,
            REMESSA,
            GP_ID,
            SALDO,
            PRODUCAO,
            USADO,
            DATA_PRODUCAO,
            CCUSTO
        from(
        
            select
                u.perfil AS PERFIL_UP,
                P.produto_codigo,
                P.tamanho,
                p.remessa as remessa_id,
                p.remessa_acumulado_controle as remessa_talao_id,
                p.controle as talao_id,
                p.controle,
                R.remessa,
                r.gp_id,
                p.quantidade_saldo as saldo,
                p.quantidade_producao as producao,
                coalesce((select sum(j.quantidade) from tbremessa_consumo_vinculo j where j.remessa_talao_detalhe_id = p.controle),0) as usado,
                p.data_producao,
                U.ccusto
            from tbpedido_item_processado p, tbremessa r, tbremessa_item_processado K, tbup u
            where  p.data_producao between :DATA_INICIO and :DATA_FIM
            and p.situacao = 3
            and r.numero = p.remessa
            and r.web = '1'
            and r.familia_codigo = 39
            and r.componente = '1'
            and p.quantidade_saldo > 0
            AND K.remessa = P.remessa
            AND K.controle = P.remessa_acumulado_controle
            AND U.id = K.up_id
            and coalesce(p.estoque_id_residuo,0) = 0
        
        ) a where producao >  usado
        and (producao - usado) = saldo
        and saldo > 0
    into
        FAMILIA_ID,
        PERFIL_UP,
        PRODUTO_CODIGO,
        TAMANHO,
        REMESSA_ID,
        REMESSA_TALAO_ID,
        TALAO_ID,
        CONTROLE,
        REMESSA,
        GP_ID,
        SALDO,
        PRODUCAO,
        USADO,
        DATA_PRODUCAO,
        CCUSTO
    do begin
        ID_ESTOQUE_RESIDUO = GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1);
        
        update tbpedido_item_processado p set p.estoque_id_residuo = :ID_ESTOQUE_RESIDUO where p.controle = :talao_id;

        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(3,:gp_id,:PERFIL_UP,:FAMILIA_ID,14,'TBREMESSA_CONSUMO',
            3,
            :remessa_talao_id,
            1,
            current_date,
            :produto_codigo,
            :tamanho,
            :saldo,
            'S',
            '1',
            :CCUSTO,
            '(***) SAIDA DE RESIDUO TECIDO.',
            :ID_ESTOQUE_RESIDUO,
            :remessa_id,
            :talao_id,
            'RD'||FN_LPAD(:talao_id,11,0)
        );

        CORPO = CORPO || '<br>';
        CORPO = CORPO || 'Rem.:'||REMESSA||'/'||REMESSA_TALAO_ID||' em '||formatdate(data_producao)||'<br>';
        CORPO = CORPO || 'Pro.:'||produto_codigo||' - '||coalesce((select first 1 k.descricao from tbproduto k where k.codigo = :produto_codigo),'')||', Tam.:'||coalesce(fn_tamanho_produto(produto_codigo,tamanho),'')||', Qtd.:'||coalesce(saldo,0)||'<br>';
    end

    --baixa de residuos de manta
    for
        select
            71 FAMILIA_ID,
            PERFIL_UP,
            PRODUTO_CODIGO,
            TAMANHO,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            TALAO_ID,
            CONTROLE,
            REMESSA,
            GP_ID,
            SALDO,
            PRODUCAO,
            USADO,
            DATA_PRODUCAO,
            CCUSTO
        from(
        
            select
                u.perfil AS PERFIL_UP,
                P.produto_codigo,
                P.tamanho,
                p.remessa as remessa_id,
                p.remessa_acumulado_controle as remessa_talao_id,
                p.controle as talao_id,
                p.controle,
                R.remessa,
                r.gp_id,
                p.quantidade_saldo as saldo,
                p.quantidade_producao as producao,
                coalesce((select sum(j.quantidade) from tbremessa_consumo_vinculo j where j.remessa_talao_detalhe_id = p.controle),0) as usado,
                p.data_producao,
                U.ccusto
            from tbpedido_item_processado p, tbremessa r, tbremessa_item_processado K, tbup u
            where  p.data_producao between :DATA_INICIO and :DATA_FIM
            and p.situacao = 3
            and r.numero = p.remessa
            and r.web = '1'
            and r.familia_codigo = 71
            and r.componente = '1'
            and p.quantidade_saldo > 0
            AND K.remessa = P.remessa
            AND K.controle = P.remessa_acumulado_controle
            AND U.id = K.up_id
            and coalesce(p.estoque_id_residuo,0) = 0
        
        ) a where producao >  usado
        and (producao - usado) = saldo
        and saldo > 0
    into
        FAMILIA_ID,
        PERFIL_UP,
        PRODUTO_CODIGO,
        TAMANHO,
        REMESSA_ID,
        REMESSA_TALAO_ID,
        TALAO_ID,
        CONTROLE,
        REMESSA,
        GP_ID,
        SALDO,
        PRODUCAO,
        USADO,
        DATA_PRODUCAO,
        CCUSTO
    do begin
        ID_ESTOQUE_RESIDUO = GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1);
        
        update tbpedido_item_processado p set p.estoque_id_residuo = :ID_ESTOQUE_RESIDUO where p.controle = :talao_id;

        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(3,:gp_id,:PERFIL_UP,:FAMILIA_ID,14,'TBREMESSA_CONSUMO',
            3,
            :remessa_talao_id,
            1,
            :data_producao,
            current_date,
            :tamanho,
            :saldo,
            'S',
            '1',
            :CCUSTO,
            '(***) SAIDA DE RESIDUO MANTA.',
            :ID_ESTOQUE_RESIDUO,
            :remessa_id,
            :talao_id,
            'RD'||FN_LPAD(:talao_id,11,0)
        );

        CORPO = CORPO || '<br>';
        CORPO = CORPO || 'Rem.:'||REMESSA||'/'||REMESSA_TALAO_ID||' em '||formatdate(data_producao)||'<br>';
        CORPO = CORPO || 'Pro.:'||produto_codigo||' - '||coalesce((select first 1 k.descricao from tbproduto k where k.codigo = :produto_codigo),'')||', Tam.:'||coalesce(fn_tamanho_produto(produto_codigo,tamanho),'')||', Qtd.:'||saldo||'<br>';

    end

    FOR
        select
            3 FAMILIA_ID,
            'U' PERFIL_UP,
            PRODUTO_CODIGO,
            TAMANHO,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            TALAO_ID,
            CONTROLE,
            REMESSA,
            GP_ID,
            0 SALDO,
            PRODUCAO,
            0 USADO,
            DATA_PRODUCAO,
            '21' AS CCUSTO
        from(
            select
                p.remessa as remessa_id,
                p.remessa_acumulado_controle as remessa_talao_id,
                p.controle as talao_id,
                p.controle,
                r.remessa,
                P.programacao_esteira AS GP_ID,
                p.remessa_acumulado_controle as talao,
                j.descricao as produto,
                p.produto_codigo,
                p.data_producao,
                p.quantidade_producao as PRODUCAO,
                p.tamanho
            from tbremessa r, tbproduto j, tbpedido_item_processado p
            left join tbremessa_consumo_vinculo v on v.remessa_talao_detalhe_id = p.controle
            where p.remessa = r.numero
            and p.data_producao between :DATA_INICIO and :DATA_FIM
            and r.web = '3'
            and j.codigo = p.produto_codigo
            and v.consumo_id is null
        )

    into
        FAMILIA_ID,
        PERFIL_UP,
        PRODUTO_CODIGO,
        TAMANHO,
        REMESSA_ID,
        REMESSA_TALAO_ID,
        TALAO_ID,
        CONTROLE,
        REMESSA,
        GP_ID,
        SALDO,
        PRODUCAO,
        USADO,
        DATA_PRODUCAO,
        CCUSTO
    do begin

        ID_ESTOQUE_RESIDUO = GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1);
        
        update tbpedido_item_processado p set p.estoque_id_residuo = :ID_ESTOQUE_RESIDUO where p.controle = :talao_id;

        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(3,:gp_id,:PERFIL_UP,:FAMILIA_ID,14,'TBREMESSA_CONSUMO',
            3,
            :remessa_talao_id,
            1,
            :data_producao,
            current_date,
            :tamanho,
            :PRODUCAO,
            'S',
            '1',
            :CCUSTO,
            '(***) SAIDA DE RESIDUO BOJO/PLACA.',
            :ID_ESTOQUE_RESIDUO,
            :remessa_id,
            :talao_id,
            'RD'||FN_LPAD(:talao_id,11,0)
        );

        CORPO = CORPO || '<br>';
        CORPO = CORPO || 'Rem.:'||REMESSA||'/'||REMESSA_TALAO_ID||' em '||formatdate(data_producao)||'<br>';
        CORPO = CORPO || 'Pro.:'||produto_codigo||' - '||coalesce((select first 1 k.descricao from tbproduto k where k.codigo = :produto_codigo),'')||', Tam.:'||coalesce(fn_tamanho_produto(produto_codigo,tamanho),'')||', Qtd.:'||saldo||'<br>';
    end

    EMAIL_ENVIADO = 0;
    ECORPO = CORPO;

    IF(char_length(CORPO) > 0)THEN
    BEGIN
        EMAIL = fn_parametro('SISTEMA.EMAIL_BAIXA_RESIDUOS');

        EXECUTE PROCEDURE SPI_EMAIL(:EMAIL, 'BAIXA DE RESIDUO DE REMESSAS - '||formatdatetime(current_timestamp), :CORPO, 0);

        EMAIL_ENVIADO = 1;
    END

    suspend;

end
^

SET TERM ; ^

