SET TERM ^ ;

CREATE OR ALTER procedure SPU_VINCULA_TALOES_COMPONENTES (
    PARAM_REMESSA_ID integer)
returns (
    NUMERO_REMESSA integer)
as
declare variable CONTROLE_TALAO integer;
declare variable REMESSA varchar(255);
declare variable ORIGEM integer;
declare variable NUMERO integer;
declare variable CONS_ID integer;
declare variable CONS_TALAO integer;
declare variable CONS_TALAO_DETALHE_ID integer;
declare variable CONS_REMESSA integer;
declare variable CONS_ESTABELECIMENTO_ID integer;
declare variable CONS_FAMILIA_ID integer;
declare variable CONS_QUANTIDADE integer;
declare variable CONS_TAMANHO integer;
declare variable CONS_PRODUTO_ID integer;
declare variable CONS_COR_ID integer;
declare variable CONS_MODELO_CODIGO integer;
declare variable CONS_MODELO_ORIGEM integer;
declare variable CONS_ATRIBUIDO integer;
declare variable TALAO_ID integer;
declare variable TALAO_CONTROLE integer;
declare variable TALAO_REMESSA integer;
declare variable TALAO_PRODUTO_CODIGO integer;
declare variable TALAO_PRODUTO_ORIGEM integer;
declare variable TALAO_COR_CODIGO integer;
declare variable TALAO_DESCRICAO varchar(255);
declare variable TALAO_LOCALIZACAO_CODIGO integer;
declare variable TALAO_MODELO_ORIGEM integer;
declare variable TALAO_MODELO_CODIGO integer;
declare variable TALAO_FAMILIA_CODIGO integer;
declare variable TALAO_TAMANHO integer;
declare variable TALAO_TAMANHO_ORIGEM integer;
declare variable TALAO_QUANTIDADE integer;
declare variable TALAO_QUANTIDADE_ALTERNATIVA integer;
declare variable TALAO_QUANTIDADE_SOBRA integer;
declare variable TALAO_QUANTIDADE_ORIGINAL integer;
declare variable TALAO_QUANTIDADE_VINCULADO integer;
declare variable QUANTIDADE_ATRIBUIDA integer;
declare variable CONSUMO_SALDO integer;
declare variable VALOR_TALAO integer;
declare variable FATOR_CONVERSAO numeric(15,4);
begin

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

    vinculação entre remessas - seamless

    A partir da remessa de origem [D], geralmente a última a ser produzida, é
    feita a vinculação de seu [consumo fixo] com o talão da próxima remessa a
    ser gerada.

    A vinculação é feita de forma recursiva.

    sentido: [D] > [C] > [B] > [A]

    O consumo fixo de 1 ou mais talões da remessa [D] é vinculado ao produto 
    [diretamente ao talão] gerado de 1 ou mais talões da remessa [C] e assim
    por diante

    Versão 1.0: 20.08.2024 -    primeira implementação.

    Versão 1.1: 22.10.2024 -    implementação do espelho de consumo dos talões
                                com tabelas temporárias.

    Versão 1.2: 06.12.2024 -    implementação de regra de fator de conversão
                                para atender tubos simples e duplos.

    @colab: Anselmo Lopes; Anderson Sousa; Washington Nilo

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

    :numero_remessa = :param_remessa_id;

    for
        select first 1
            r.controle_talao,
            r.remessa,
            r.origem,
            r.numero
        from tbremessa r
        where r.remessa_origem = :param_remessa_id
    into
        :controle_talao,
        :remessa,
        :origem,
        :numero
    do
    begin

        delete from tbremessa_consumo_vinculo t where t.remessa_id = :numero;

        begin

            for
                select
                    id,
                    talao,
                    talao_detalhe_id,
                    remessa,
                    estabelecimento_id,
                    familia_id,
                    quantidade,
                    tamanho,
                    produto_id,
                    cor_id,
                    modelo_codigo,
                    modelo_origem,
                    atribuido
                from(
                    select
                        t.id,
                        t.talao,
                        t.talao_detalhe_id,
                        t.remessa,
                        t.estabelecimento_id,
                        t.familia_id,
                        t.quantidade,
                        t.tamanho,
                        t.produto_id,
                        (select p.cor_codigo from tbpedido_item_processado d, tbproduto p where d.controle = t.talao_detalhe_id and d.produto_origem = p.codigo) cor_id,
                        p.modelo_codigo,
                        p.modelo_origem,
                        (select coalesce(sum(rcv.quantidade), 0) from tbremessa_consumo_vinculo rcv where rcv.remessa_talao_id = t.talao and rcv.remessa_id = t.remessa) as atribuido
                    from tbremessa_consumo t, tbproduto p
                    where t.remessa = :param_remessa_id
                    and t.fixo = 1
                    and t.produto_id = p.codigo
                ) x
            into
                :cons_id,
                :cons_talao,
                :cons_talao_detalhe_id,
                :cons_remessa,
                :cons_estabelecimento_id,
                :cons_familia_id,
                :cons_quantidade,
                :cons_tamanho,
                :cons_produto_id,
                :cons_cor_id,
                :cons_modelo_codigo,
                :cons_modelo_origem,
                :cons_atribuido
            do
            begin

                :consumo_saldo  = :cons_quantidade ;
                begin

                    for
                        select
                            rip.controle                   as talao_id,
                            rip.remessa_acumulado_controle as talao_controle,
                            rip.remessa                    as talao_remessa,
                            iif(rip.peca_conjunto_id > 0,rip.produto_origem,rip.produto_codigo)  as talao_produto_codigo,
                            rip.produto_origem             as talao_produto_origem,
                            p.cor_codigo                   as talao_cor_codigo,
                            p.descricao                    as talao_descricao,
                            p.localizacao_codigo           as talao_localizacao_codigo,
                            p.modelo_origem                as talao_modelo_origem,
                            p.modelo_codigo                as talao_modelo_codigo,
                            rip.familia_codigo             as talao_familia_codigo,
                            iif(rip.peca_conjunto_id > 0,rip.tamanho_origem ,rip.tamanho) as talao_tamanho,
                            rip.tamanho_origem             as talao_tamanho_origem,
                            coalesce(
                                cast(
                                    rip.quantidade_producao
                                    as integer
                                )
                            , 0) / coalesce((select first 1 fator_conversao from tbmodelo m where m.codigo = RIP.modelo_codigo AND M.modelo_pai = RIP.modelo_origem) , 1)  as talao_quantidade,
                            rip.quantidade_altern  as talao_quantidade_alternativa,
                            rip.quantidade_sobra        as talao_quantidade_sobra,
                            rip.quantidade_pedido     as talao_quantidade_original,
                            (select coalesce(cast(sum(rcv.quantidade) as integer), 0)
                                from tbremessa_consumo_vinculo rcv
                                where rcv.remessa_talao_detalhe_id = rip.controle
                                and rcv.remessa_id = rip.remessa) as talao_quantidade_vinculado
                        from tbpedido_item_processado rip, tbproduto p
                        where rip.remessa = :numero
                        and rip.produto_origem = p.codigo
                        and iif(rip.peca_conjunto_id > 0, rip.peca_conjunto_seq = 1, true)
                    into
                        :talao_id,
                        :talao_controle,
                        :talao_remessa,
                        :talao_produto_codigo,
                        :talao_produto_origem,
                        :talao_cor_codigo,
                        :talao_descricao,
                        :talao_localizacao_codigo,
                        :talao_modelo_origem,
                        :talao_modelo_codigo,
                        :talao_familia_codigo,
                        :talao_tamanho,
                        :talao_tamanho_origem,
                        :talao_quantidade,
                        :talao_quantidade_alternativa,
                        :talao_quantidade_sobra,
                        :talao_quantidade_original,
                        :talao_quantidade_vinculado
                    do
                    begin
                        if(:consumo_saldo > 0
--                            and talao_quantidade_vinculado < talao_quantidade
                            and talao_produto_codigo = cons_produto_id
                            and talao_tamanho = cons_tamanho
                            and talao_cor_codigo = cons_cor_id
                        ) then
                        begin

                            :quantidade_atribuida = 0;

                            /* consulta o saldo do talão baseado no 'espelho' gerado na tabela temporária */
                            
                            :valor_talao    = coalesce(:talao_quantidade, 0) - coalesce((select sum(rcv.inteiro_05) from tmpgeral rcv where rcv.inteiro_04 = :talao_id),0);

                            if(:consumo_saldo <= :valor_talao) then
                            begin
                                :quantidade_atribuida = :consumo_saldo;
                            end

                            if(:consumo_saldo > :valor_talao) then
                            begin
                                :quantidade_atribuida = :valor_talao;
                            end

                            :consumo_saldo = :consumo_saldo - :quantidade_atribuida;

                            if(:consumo_saldo < 0)then
                            begin
                               :quantidade_atribuida = :quantidade_atribuida + :consumo_saldo;
                            end

                            if(:quantidade_atribuida > 0) then
                            begin
                                /* tabela temporário para espelho do que foi inserido */
                                begin
                                    insert into
                                        tmpgeral (
                                            inteiro_01,
                                            inteiro_02,
                                            inteiro_03,
                                            inteiro_04,
                                            inteiro_05
                                        )
                                    values
                                        (
                                            :cons_id,
                                            :numero,
                                            :talao_controle,
                                            :talao_id,
                                            :quantidade_atribuida
                                        );
                                end

                                /* tabela principal do que foi inserido */
                                begin
                                    insert into
                                        tbremessa_consumo_vinculo (
                                            consumo_id,
                                            remessa_id,
                                            remessa_talao_id,
                                            remessa_talao_detalhe_id,
                                            quantidade,
                                            etiqueta
                                        )
                                    values
                                        (
                                            :cons_id,
                                            :numero,
                                            :talao_controle,
                                            :talao_id,
                                            :quantidade_atribuida,
                                            1
                                        );
                                end
                            end
                        end
                    end
                end
            end

        end

        if(:remessa is not null) then
        begin
            /* call para recursão e passar por todas as remessas */
            for
                select
                    numero_remessa
                from spu_vincula_taloes_componentes(:numero)
            into
                numero
            do
            begin
                :numero_remessa = :numero;
                suspend;
            end
        end
    end
end
^

SET TERM ; ^

