ALTER TABLE TBTALAO_VINCULO ADD STATUS INTEGER DEFAULT 0;

CREATE OR ALTER trigger ttbprogramacao_b12u for tbprogramacao
active after update position 61
AS
DECLARE VARIABLE CONTADOR BIGINT;
Declare variable PROGRAMACAO_ID integer;
Declare variable REMESSA_ID integer;
Declare variable REMESSA_TALAO_ID integer;
Declare variable ID integer;
Declare variable VINCULO_ID integer;
Declare variable tempo numeric(18,8);
Declare variable tempo_previsto numeric(18,8);
Declare variable quantidade numeric(18,8);
Declare variable tempo_realizado numeric(18,8);
Declare variable QTD_TOTAL numeric(18,8);
Declare variable WEB Char(1);
Declare variable LINHA integer;
Declare variable LINHAS integer;
BEGIN

    IF ( OLD.STATUS = '2' AND NEW.STATUS IN ('3','1') ) THEN
    BEGIN
        
        --nao he da conformacao
        IF ( COALESCE(NEW.FERRAMENTA_ID,0) = 0 ) THEN
        BEGIN
                               
            tempo = new.tempo_realizado;

            --se talao esta vinculado a outros taloes ATUALIZA OS SITUACAO
            for
                select distinct
                    quantidade,
                    VINCULO_ID,
                    PROGRAMACAO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    ID,
                    tempo_realizado,
                    row_number() over() as LINHA,
                    sum(1) over() LINHAS,
                    sum(quantidade) over() QTD_TOTAL
                from(
                    SELECT
                        r.quantidade,
                        v2.vinculo_id,
                        r.id as PROGRAMACAO_ID,
                        v2.REMESSA_ID,
                        v2.TALAO_ID as REMESSA_TALAO_ID,
                        t.id as ID,
                        r.tempo,
                        r.tempo_realizado
                    from TBTALAO_VINCULO v1, TBTALAO_VINCULO v2, vwremessa_talao t, vwremessa_talao t2, tbprogramacao r, tbprogramacao r2
                    where v1.remessa_id = t2.remessa_id
                    and v1.talao_id = t2.remessa_talao_id
                    and v2.vinculo_id = v1.vinculo_id
                    and t.remessa_id = v2.remessa_id
                    and t.remessa_talao_id = v2.talao_id
                    and r.tabela_id = t.id
                    and r2.id = new.id
                    and t2.id = r2.tabela_id
                    and r2.tipo = 'A'
                    and r.tipo = 'A'
                )
            into    
                :quantidade,
                :VINCULO_ID,
                :PROGRAMACAO_ID,
                :REMESSA_ID,
                :REMESSA_TALAO_ID,
                :ID,
                :tempo_previsto,
                :LINHA,
                :LINHAS,
                :QTD_TOTAL
            do begin


                tempo_realizado = fn_calc_precision(tempo, fn_calc_precision(quantidade, QTD_TOTAL,'/') ,'*');


                update TBPROGRAMACAO h set h.tempo_realizado = :tempo_realizado where h.id = :PROGRAMACAO_ID;


            end

        END
    END

END;

COMMENT ON TRIGGER TTBPROGRAMACAO_B12U IS 'calcular tempo de taloes vinculados';

CREATE INDEX ITBTALAO_VINCULO_04
ON TBTALAO_VINCULO (REMESSA_ID,TALAO_ID);


CREATE OR ALTER trigger ttbtalao_vinculo_b01iu for tbtalao_vinculo
active before insert or update position 0
AS
declare variable vinculo_id integer;
declare variable status integer;
begin

    vinculo_id = coalesce((select s.vinculo_id from TBTALAO_VINCULO s where s.remessa_id = new.remessa_id and s.talao_id = new.talao_id and s.vinculo_id <> new.vinculo_id),0);
    
    if(vinculo_id > 0)then
    begin
      exception "..." 'Remessa: '||new.remessa_id||', Talão: '||new.talao_id||' já tem um vínculo (ID:'||:vinculo_id||').';
    end

    select
        p.status
    from vwremessa_talao t, tbprogramacao p
    where t.remessa_id = new.REMESSA_ID
    and t.remessa_talao_id = new.TALAO_ID
    and p.tabela_id = t.id
    and p.remessa_id = t.remessa_id
    and p.tipo = 'A'
    into status;

    status = coalesce(status,-1);

    if(not (status = 1 or status = 0))then
    begin

        exception "..." 'Remessa: '||new.remessa_id||', Talão: '||new.talao_id||' não pode ser vinculado, Status: "'||
            iif(status = 0, '0 - PARADO',
            iif(status = 1, '1 - INICIADO/PARADO',
            iif(status = 2, '2 - EM ANDAMENTO',
            iif(status = 3, '3 - FINALIZADO',
            iif(status = 6, '6 - ENCERRADO', 'Não Identificado')))))||'"';

    end

end;

CREATE trigger ttbtalao_vinculo_b01d for tbtalao_vinculo
active before delete position 0
AS
declare variable status integer;
begin

    select
        p.status
    from vwremessa_talao t, tbprogramacao p
    where t.remessa_id = old.REMESSA_ID
    and t.remessa_talao_id = old.TALAO_ID
    and p.tabela_id = t.id
    and p.remessa_id = t.remessa_id
    and p.tipo = 'A'
    into status;

    status = coalesce(status,-1);

    if(not (status = 1 or status = 0))then
    begin

        exception "..." 'Remessa: '||old.remessa_id||', Talão: '||old.talao_id||' não pode ser desvinculado, Status: "'||
            iif(status = 0, '0 - PARADO',
            iif(status = 1, '1 - INICIADO/PARADO',
            iif(status = 2, '2 - EM ANDAMENTO',
            iif(status = 3, '3 - FINALIZADO',
            iif(status = 6, '6 - ENCERRADO', 'Não Identificado')))))||'"';

    end

end;

COMMENT ON TRIGGER TTBESTOQUE_TRANSACAO_ITEM_A01I IS 'baixa peças automáticamente (TBESTOQUE_BAIXA_AUTOMATICA)';

CREATE OR ALTER trigger ttbestoque_transacao_item_b3u for tbestoque_transacao_item
active before update position 3
AS    
DECLARE VARIABLE REGRAS BIGINT;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE GP_ID INTEGER;
DECLARE VARIABLE PERFIL_UP VARCHAR(40);
DECLARE VARIABLE FAMILIA_ID INTEGER;
DECLARE VARIABLE LOCALIZACAO_ID_SAIDA INTEGER;
DECLARE VARIABLE LOCALIZACAO_ID_ENTRADA INTEGER;
DECLARE VARIABLE CONFERENCIA INTEGER;
DECLARE VARIABLE OPERACAO_ESTOQUE_SAIDA VARCHAR(40);
DECLARE VARIABLE OPERACAO_ESTOQUE_ENTRADA VARCHAR(40);
DECLARE VARIABLE ALOCACAO_TIPO VARCHAR(10);
DECLARE VARIABLE PECA VARCHAR(100);
DECLARE VARIABLE ALOCACAO_TABELA_ID INTEGER;
DECLARE VARIABLE ALOCACAO_TAB_ITEM_ID INTEGER;
BEGIN

    IF ( NEW.ESTOQUE_TRANSACAO_REGRA_ID > 0 AND NEW.TIPO = 'E' ) THEN
    BEGIN
        IF ( OLD.CONFERENCIA = 1 AND NEW.CONFERENCIA = 2 ) THEN
        BEGIN

            :PECA = trim(fn_replace(new.peca_id,'R|D|A|P','','|'));
            execute procedure SPI_HISTORICO('TBPRODUTO_REVISAO', new.produto_codigo, 'ID DA PECA: '||:PECA||' Conferência Registrada');
                        
            DELETE
              FROM TBESTOQUE_DETALHE_ALOCACAO D
             WHERE TIPO        = 'E'
               AND TAB_ITEM_ID = NEW.CONTROLE;
        END
        IF ( OLD.CONFERENCIA = 2 AND NEW.CONFERENCIA = 1 ) THEN
        BEGIN
    
            ID = 0;

            :PECA = trim(fn_replace(new.peca_id,'R|D|A|P','','|'));
            execute procedure SPI_HISTORICO('TBPRODUTO_REVISAO',  new.produto_codigo, 'ID DA PECA: '||:PECA||' Conferência Defeita');
    
         for
            SELECT
                ID,
                TIPO,
                GP_ID,
                PERFIL_UP,
                FAMILIA_ID,
                LOCALIZACAO_ID_SAIDA,
                LOCALIZACAO_ID_ENTRADA,
                CONFERENCIA,
                OPERACAO_ESTOQUE_SAIDA,
                OPERACAO_ESTOQUE_ENTRADA
            FROM TBESTOQUE_TRANSACAO_REGRA R
            WHERE R.ID = NEW.ESTOQUE_TRANSACAO_REGRA_ID
            INTO
                :ID,
                :TIPO,
                :GP_ID,
                :PERFIL_UP,
                :FAMILIA_ID,
                :LOCALIZACAO_ID_SAIDA,
                :LOCALIZACAO_ID_ENTRADA,
                :CONFERENCIA,
                :OPERACAO_ESTOQUE_SAIDA,
                :OPERACAO_ESTOQUE_ENTRADA
           do
           begin

           end
        
            IF ( ID = 0 ) THEN
            BEGIN
                EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE NAO ENCONTRADA. ENTRE EM CONTATO COM SUPORTE TECNICO. RAMAL 27';
            END
        
            if ( CONFERENCIA = '1' ) then
            begin
               -- ALOCACAO_TIPO = '';
               -- ALOCACAO_TABELA_ID = 0;
               -- ALOCACAO_TAB_ITEM_ID = 0;
        
               -- IF ( TIPO = 1 ) THEN
               -- BEGIN
                    ALOCACAO_TIPO = 'E'; -- E = REGRAS DE 'E'STOQUE;
                    ALOCACAO_TABELA_ID   = NEW.CONTROLE;
                    ALOCACAO_TAB_ITEM_ID = NEW.CONTROLE;
               -- END
        
        
                IF ( ALOCACAO_TIPO = '' OR ALOCACAO_TABELA_ID = 0 OR ALOCACAO_TAB_ITEM_ID = 0 ) THEN
                BEGIN
                   exception "..." 'INFORMACOES DE ALOCACAO PARA CONFERENCIA DA TRANSACAO DE ESTOQUE NAO ENCONTRADA. ENTRE EM CONTATO COM O SUPORTE TECNICO, RAMAL 27';
                END
        
                INSERT INTO TBESTOQUE_DETALHE_ALOCACAO (
                    ESTABELECIMENTO_ID,
                    TABELA_ID,
                    TAB_ITEM_ID,
                    TIPO,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    SALDO
                ) VALUES (
                    NEW.ESTABELECIMENTO_CODIGO,
                    :ALOCACAO_TABELA_ID,
                    :ALOCACAO_TAB_ITEM_ID,
                    :ALOCACAO_TIPO,
                    NEW.LOCALIZACAO_CODIGO,
                    NEW.PRODUTO_CODIGO,
                    IIF(NEW.T01 > 0,01,
                    IIF(NEW.T02 > 0,02,
                    IIF(NEW.T03 > 0,03,
                    IIF(NEW.T04 > 0,04,
                    IIF(NEW.T05 > 0,05,
                    IIF(NEW.T06 > 0,06,
                    IIF(NEW.T07 > 0,07,
                    IIF(NEW.T08 > 0,08,
                    IIF(NEW.T09 > 0,09,
                    IIF(NEW.T10 > 0,10,
                    IIF(NEW.T11 > 0,11,
                    IIF(NEW.T12 > 0,12,
                    IIF(NEW.T13 > 0,13,
                    IIF(NEW.T14 > 0,14,
                    IIF(NEW.T15 > 0,15,
                    IIF(NEW.T16 > 0,16,
                    IIF(NEW.T17 > 0,17,
                    IIF(NEW.T18 > 0,18,
                    IIF(NEW.T19 > 0,19,
                    IIF(NEW.T20 > 0,20,0)))))))))))))))))))),
                    NEW.QUANTIDADE,
                    NEW.QUANTIDADE
                );
            END

        END
    END


END;

CREATE OR ALTER procedure spu_excluir_liberacao (
    i_estoque_id varchar(3000),
    i_operador_id integer)
as
declare variable estoque_id integer;
declare variable operador_descricao varchar(200);
declare variable tipo varchar(2);
declare variable produto_id integer;
declare variable peca_id varchar(100);
BEGIN
    
    FOR
        SELECT OSPLIT
          FROM SPLIT(:I_ESTOQUE_ID,',')
    INTO
        ESTOQUE_ID
    DO
    BEGIN
        OPERADOR_DESCRICAO = COALESCE((
            SELECT FIRST 1 NOME
              FROM TBOPERADOR O
             WHERE O.CODIGO = :I_OPERADOR_ID),'');

        SELECT FIRST 1 k.tipo, k.produto_codigo, k.peca_id
          FROM TBESTOQUE_TRANSACAO_ITEM k
          WHERE k.CONTROLE = :ESTOQUE_ID
          into :TIPO,:produto_id,:PECA_ID;

          TIPO = coalesce(TIPO, '');
          produto_id = coalesce(produto_id, 0);
          PECA_ID = coalesce(PECA_ID, '');

          :PECA_ID = trim(fn_replace(:PECA_ID,'R|D|A|P','','|'));

        if(TIPO = 'E')then
        begin
            execute procedure SPU_HISTORICO_TRANSACAO(ESTOQUE_ID, 'TRANSFERENCIA DESFEITO PELO OPERADOR: ' || :I_OPERADOR_ID || ' - ' || :OPERADOR_DESCRICAO);
            
            execute procedure SPI_HISTORICO('TBPRODUTO_REVISAO', :produto_id, 'ID DA PECA: '||:PECA_ID||', TRANSFERENCIA DESFEITO PELO OPERADOR: ' || :I_OPERADOR_ID || ' - ' || :OPERADOR_DESCRICAO);
        end

        delete from TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :ESTOQUE_ID;

    END


END;

