


CREATE OR ALTER TRIGGER TBREQUISICAO_PLACA_BI FOR TBREQUISICAO_PLACA
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBREQUISICAO_PLACA,1);
END;

CREATE OR ALTER TRIGGER TBREQUISICAO_PLACA_BI0 FOR TBREQUISICAO_PLACA
INACTIVE BEFORE INSERT POSITION 0
AS
declare variable CONSUMO_ID INTEGER;
declare variable REMESSA VARCHAR(15);
BEGIN

    CONSUMO_ID = COALESCE((
        SELECT FIRST 1 C.ID
          FROM VWREMESSA_CONSUMO C
         WHERE C.REMESSA_ID      = NEW.REMESSA
          AND C.REMESSA_TALAO_ID = NEW.TALAO),0);
    
    IF ( CONSUMO_ID > 0 ) THEN
    BEGIN
    
        REMESSA = COALESCE((
            SELECT FIRST 1 REMESSA
              FROM VWREMESSA R
             WHERE R.REMESSA_ID = NEW.REMESSA),'');

        EXCEPTION "..." 'ALOCACAO DE PLACAS NAO PERMITIDA PARA TALOES COM CONSUMO GERADO. REMESSA: ' || REMESSA || ' TALAO: ' || LPAD(NEW.TALAO,4);

    END
END;

CREATE OR ALTER TRIGGER TTBREQUISICAO_PLACA_B0D_01 FOR TBREQUISICAO_PLACA
ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN

  if (OLD.SALDO < OLD.QUANTIDADE) then
      Begin
      Exception "..." 'EXCLUSÃO NÃO PERMITIDA PARA REGISTROS DE JÁ BAIXADAS.'||
                      ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

END;

CREATE OR ALTER TRIGGER TTBREQUISICAO_PLACA_B0U_01 FOR TBREQUISICAO_PLACA
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN

  if (NEW.SALDO < 0) then
      Begin
      Exception "..." 'REGISTRO NÃO PODE SER NEGATIVO.'||
                      ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      End

  if (NEW.SALDO = 0 AND OLD.SALDO <> NEW.SALDO) then
      Begin
      NEW.STATUS = '1';
      End

  if (NEW.SALDO = NEW.QUANTIDADE AND OLD.SALDO <> NEW.SALDO) then
      Begin
      NEW.STATUS = '0';
      End

END;





CREATE OR ALTER trigger ttbrequisicao_placa_bi2 for tbrequisicao_placa
active before insert position 2
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( NEW.id > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Reg. incluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBREQUISICAO_PLACA',NEW.id, HISTORICO);
    END
end;









CREATE OR ALTER procedure SPC_REQUISICAO_PLACA (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer)
returns (
    PECA_ID integer,
    PECA_SALDO numeric(15,4),
    PECA_ENDERECAMENTO integer,
    PECA_TALAO_ID integer,
    PACA_QTD_PARES integer,
    PECA_REMESSA_ID integer,
    PECA_PRODUTO_ID integer)
as
declare variable MATRIZ_CODIGO integer;
declare variable TAMANHO integer;
declare variable PRODUTO_CODIGO integer;
declare variable COR_CODIGO integer;
declare variable LARGURA numeric(18,5);
declare variable COMPRIMENTO numeric(18,5);
declare variable DENSIDADE numeric(18,2);
declare variable ESPESSURA numeric(18,2);
begin

    select
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        COR_CODIGO,
        LARGURA,
        COMPRIMENTO,
        PACA_QTD_PARES,
        cast( fn_array(DEN_ESP, 1, '|') as numeric(15,2)) as DENSIDADE,
        cast( fn_array(DEN_ESP, 2, '|') as numeric(15,2)) as ESPESSURA
    from(
        select
            p.matriz_codigo,
            p.tamanho,
            p.produto_codigo,
            f.cor_codigo,
            fn_densidade_espessura(f.modelo_codigo, f.cor_codigo) as DEN_ESP,
            iif(p.tamanho =  0, t.largura,
            iif(p.tamanho =  1, t.largura_t01,
            iif(p.tamanho =  2, t.largura_t02,
            iif(p.tamanho =  3, t.largura_t03,
            iif(p.tamanho =  4, t.largura_t04,
            iif(p.tamanho =  5, t.largura_t05,
            iif(p.tamanho =  6, t.largura_t06,
            iif(p.tamanho =  7, t.largura_t07,
            iif(p.tamanho =  8, t.largura_t08,
            iif(p.tamanho =  9, t.largura_t09,
            iif(p.tamanho = 10, t.largura_t10,
            iif(p.tamanho = 11, t.largura_t11,
            iif(p.tamanho = 12, t.largura_t12,
            iif(p.tamanho = 13, t.largura_t13,
            iif(p.tamanho = 14, t.largura_t14,
            iif(p.tamanho = 15, t.largura_t15,
            iif(p.tamanho = 16, t.largura_t16,
            iif(p.tamanho = 17, t.largura_t17,
            iif(p.tamanho = 18, t.largura_t18,
            iif(p.tamanho = 19, t.largura_t19,
            iif(p.tamanho = 20, t.largura_t20,
            0))))))))))))))))))))) as LARGURA,
        
            iif(p.tamanho =  1, t.comprimento_t01,
            iif(p.tamanho =  2, t.comprimento_t02,
            iif(p.tamanho =  3, t.comprimento_t03,
            iif(p.tamanho =  4, t.comprimento_t04,
            iif(p.tamanho =  5, t.comprimento_t05,
            iif(p.tamanho =  6, t.comprimento_t06,
            iif(p.tamanho =  7, t.comprimento_t07,
            iif(p.tamanho =  8, t.comprimento_t08,
            iif(p.tamanho =  9, t.comprimento_t09,
            iif(p.tamanho = 10, t.comprimento_t10,
            iif(p.tamanho = 11, t.comprimento_t11,
            iif(p.tamanho = 12, t.comprimento_t12,
            iif(p.tamanho = 13, t.comprimento_t13,
            iif(p.tamanho = 14, t.comprimento_t14,
            iif(p.tamanho = 15, t.comprimento_t15,
            iif(p.tamanho = 16, t.comprimento_t16,
            iif(p.tamanho = 17, t.comprimento_t17,
            iif(p.tamanho = 18, t.comprimento_t18,
            iif(p.tamanho = 19, t.comprimento_t19,
            iif(p.tamanho = 20, t.comprimento_t20,
            0)))))))))))))))))))) as COMPRIMENTO,

            iif(p.tamanho =  1, t.quantidade_t01,
            iif(p.tamanho =  2, t.quantidade_t02,
            iif(p.tamanho =  3, t.quantidade_t03,
            iif(p.tamanho =  4, t.quantidade_t04,
            iif(p.tamanho =  5, t.quantidade_t05,
            iif(p.tamanho =  6, t.quantidade_t06,
            iif(p.tamanho =  7, t.quantidade_t07,
            iif(p.tamanho =  8, t.quantidade_t08,
            iif(p.tamanho =  9, t.quantidade_t09,
            iif(p.tamanho = 10, t.quantidade_t10,
            iif(p.tamanho = 11, t.quantidade_t11,
            iif(p.tamanho = 12, t.quantidade_t12,
            iif(p.tamanho = 13, t.quantidade_t13,
            iif(p.tamanho = 14, t.quantidade_t14,
            iif(p.tamanho = 15, t.quantidade_t15,
            iif(p.tamanho = 16, t.quantidade_t16,
            iif(p.tamanho = 17, t.quantidade_t17,
            iif(p.tamanho = 18, t.quantidade_t18,
            iif(p.tamanho = 19, t.quantidade_t19,
            iif(p.tamanho = 20, t.quantidade_t20,
            0)))))))))))))))))))) as PACA_QTD_PARES
        
          from tbremessa_item_processado p, tbmatriz t, tbproduto f
          where p.remessa = :REMESSA_ID
          and p.controle = :REMESSA_TALAO_ID
          and t.codigo = p.matriz_codigo
          and f.codigo = p.produto_codigo
    ) x into
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        COR_CODIGO,
        LARGURA,
        COMPRIMENTO,
        PACA_QTD_PARES,
        DENSIDADE,
        ESPESSURA;

    MATRIZ_CODIGO = coalesce(MATRIZ_CODIGO,0);

    if(MATRIZ_CODIGO = 0)then
    begin
        exception "..." 'Matriz não encontrada.';
    end

    for
        SELECT
            p.codigo as ID
        from tbproduto p, tbproduto_ficha f
        where MODELO_CODIGO   = ( select p.modelo_codigo from tbproduto p where p.codigo = fn_parametro('SISTEMA.PRODUTO_TALAO_PLACA'))
        and f.LARGURA         >= :LARGURA
        and f.COMPRIMENTO     >= :COMPRIMENTO
        and p.cor_codigo      = :COR_CODIGO
        and f.produto_codigo  = p.codigo
        and f.densidade       = :DENSIDADE
        and f.espessura       = :ESPESSURA
    into
        :PRODUTO_CODIGO
    do begin
        for
            select
                j.*
            from(
                SELECT
                    y.controle as id,
                    y.quantidade_saldo - coalesce((select sum(k.quantidade) from TBREQUISICAO_PLACA k where k.sobra_id = y.controle and k.status = 0),0)  as saldo,
                    y.enderecamento_id,
                    coalesce((select first 1 k.id from TBREMESSA_ITEM_PROCESSADO k where k.remessa = v.remessa_id and k.controle = v.remessa_talao_id ),0) as TALAO_ID,
                    x.remessa,
                    x.produto_codigo
                from tbproduto p, tbproduto l, TBREMESSA_ITEM_PROCESSADO X, TBPEDIDO_ITEM_PROCESSADO y, tbremessa_consumo c, tbremessa_consumo_vinculo v
                WHERE p.codigo = x.produto_codigo
                and p.modelo_codigo = l.modelo_codigo
                and l.codigo = fn_parametro('SISTEMA.PRODUTO_TALAO_PLACA')
                and y.status_saldo = 1
                and x.situacao = 3
                and y.remessa = x.remessa
                and y.remessa_acumulado_controle = x.controle
                and x.produto_codigo = :PRODUTO_CODIGO
                and c.remessa = y.remessa
                and c.talao = y.remessa_acumulado_controle
                and v.consumo_id = c.id
            ) j where j.saldo > 0

            order by j.id
        into
            PECA_ID,
            PECA_SALDO,
            PECA_ENDERECAMENTO,
            PECA_TALAO_ID,
            PECA_REMESSA_ID,
            PECA_PRODUTO_ID
        do begin

        end
    end

    suspend;
end;

CREATE OR ALTER procedure SPC_REQUISICAO_PLACA_PECAS (
    PRODUTO_ID integer,
    ITAMANHO integer,
    REQUISICAO_ID integer)
returns (
    PECA_ID integer,
    PECA_SALDO numeric(15,4),
    PECA_ENDERECAMENTO_ID integer,
    PECA_TALAO_ID integer,
    PACA_QTD_PARES integer,
    PECA_REMESSA_ID integer,
    PECA_PRODUTO_ID integer,
    PECA_PRODUTO varchar(100),
    PECA_ENDERECAMENTO varchar(50),
    PECA_LOCALIZACAO integer,
    PECA_ESTABELECIMENTO integer)
as
declare variable MATRIZ_CODIGO integer;
declare variable TAMANHO integer;
declare variable PRODUTO_CODIGO integer;
declare variable COR_CODIGO integer;
declare variable LARGURA numeric(18,5);
declare variable COMPRIMENTO numeric(18,5);
declare variable DENSIDADE numeric(18,2);
declare variable ESPESSURA numeric(18,2);
begin

    select
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        COR_CODIGO,
        LARGURA,
        COMPRIMENTO,
        PACA_QTD_PARES,
        cast( fn_array(DEN_ESP, 1, '|') as numeric(15,2)) as DENSIDADE,
        cast( fn_array(DEN_ESP, 2, '|') as numeric(15,2)) as ESPESSURA
    from(
        select
            m.matriz_codigo,
            p.tamanho,
            f.codigo produto_codigo,
            f.cor_codigo,
            fn_densidade_espessura(f.modelo_codigo, f.cor_codigo) as DEN_ESP,
            iif(p.tamanho =  0, t.largura,
            iif(p.tamanho =  1, t.largura_t01,
            iif(p.tamanho =  2, t.largura_t02,
            iif(p.tamanho =  3, t.largura_t03,
            iif(p.tamanho =  4, t.largura_t04,
            iif(p.tamanho =  5, t.largura_t05,
            iif(p.tamanho =  6, t.largura_t06,
            iif(p.tamanho =  7, t.largura_t07,
            iif(p.tamanho =  8, t.largura_t08,
            iif(p.tamanho =  9, t.largura_t09,
            iif(p.tamanho = 10, t.largura_t10,
            iif(p.tamanho = 11, t.largura_t11,
            iif(p.tamanho = 12, t.largura_t12,
            iif(p.tamanho = 13, t.largura_t13,
            iif(p.tamanho = 14, t.largura_t14,
            iif(p.tamanho = 15, t.largura_t15,
            iif(p.tamanho = 16, t.largura_t16,
            iif(p.tamanho = 17, t.largura_t17,
            iif(p.tamanho = 18, t.largura_t18,
            iif(p.tamanho = 19, t.largura_t19,
            iif(p.tamanho = 20, t.largura_t20,
            0))))))))))))))))))))) as LARGURA,
        
            iif(p.tamanho =  1, t.comprimento_t01,
            iif(p.tamanho =  2, t.comprimento_t02,
            iif(p.tamanho =  3, t.comprimento_t03,
            iif(p.tamanho =  4, t.comprimento_t04,
            iif(p.tamanho =  5, t.comprimento_t05,
            iif(p.tamanho =  6, t.comprimento_t06,
            iif(p.tamanho =  7, t.comprimento_t07,
            iif(p.tamanho =  8, t.comprimento_t08,
            iif(p.tamanho =  9, t.comprimento_t09,
            iif(p.tamanho = 10, t.comprimento_t10,
            iif(p.tamanho = 11, t.comprimento_t11,
            iif(p.tamanho = 12, t.comprimento_t12,
            iif(p.tamanho = 13, t.comprimento_t13,
            iif(p.tamanho = 14, t.comprimento_t14,
            iif(p.tamanho = 15, t.comprimento_t15,
            iif(p.tamanho = 16, t.comprimento_t16,
            iif(p.tamanho = 17, t.comprimento_t17,
            iif(p.tamanho = 18, t.comprimento_t18,
            iif(p.tamanho = 19, t.comprimento_t19,
            iif(p.tamanho = 20, t.comprimento_t20,
            0)))))))))))))))))))) as COMPRIMENTO,

            iif(p.tamanho =  1, t.quantidade_t01,
            iif(p.tamanho =  2, t.quantidade_t02,
            iif(p.tamanho =  3, t.quantidade_t03,
            iif(p.tamanho =  4, t.quantidade_t04,
            iif(p.tamanho =  5, t.quantidade_t05,
            iif(p.tamanho =  6, t.quantidade_t06,
            iif(p.tamanho =  7, t.quantidade_t07,
            iif(p.tamanho =  8, t.quantidade_t08,
            iif(p.tamanho =  9, t.quantidade_t09,
            iif(p.tamanho = 10, t.quantidade_t10,
            iif(p.tamanho = 11, t.quantidade_t11,
            iif(p.tamanho = 12, t.quantidade_t12,
            iif(p.tamanho = 13, t.quantidade_t13,
            iif(p.tamanho = 14, t.quantidade_t14,
            iif(p.tamanho = 15, t.quantidade_t15,
            iif(p.tamanho = 16, t.quantidade_t16,
            iif(p.tamanho = 17, t.quantidade_t17,
            iif(p.tamanho = 18, t.quantidade_t18,
            iif(p.tamanho = 19, t.quantidade_t19,
            iif(p.tamanho = 20, t.quantidade_t20,
            0)))))))))))))))))))) as PACA_QTD_PARES
        
          from tbmatriz t, tbproduto f, tbmodelo m, (select cast(:ITAMANHO as integer) as tamanho from rdb$database) as p
          where t.codigo = m.matriz_codigo
          and f.codigo = f.codigo
          and f.codigo = :PRODUTO_ID
          and m.codigo = f.modelo_codigo
    ) x into
        MATRIZ_CODIGO,
        TAMANHO,
        PRODUTO_CODIGO,
        COR_CODIGO,
        LARGURA,
        COMPRIMENTO,
        PACA_QTD_PARES,
        DENSIDADE,
        ESPESSURA;

    MATRIZ_CODIGO = coalesce(MATRIZ_CODIGO,0);

    if(MATRIZ_CODIGO = 0)then
    begin
        exception "..." 'Matriz não encontrada.';
    end


    for
        SELECT
            p.codigo as ID
        from tbproduto p, tbproduto_ficha f
        where MODELO_CODIGO   = ( select p.modelo_codigo from tbproduto p where p.codigo = fn_parametro('SISTEMA.PRODUTO_TALAO_PLACA'))
        and f.LARGURA         >= :LARGURA
        and f.COMPRIMENTO     >= :COMPRIMENTO
        and p.cor_codigo      = :COR_CODIGO
        and f.produto_codigo  = p.codigo
        and f.densidade       = :DENSIDADE
        and f.espessura       = :ESPESSURA
    into
        :PRODUTO_CODIGO
    do begin

        for
            select
                j.*
            from(
                SELECT

                    y.controle as id,
                    y.quantidade_saldo - coalesce((select sum(k.quantidade) from TBREQUISICAO_PLACA k where k.sobra_id = y.controle and k.status = 0 and k.id <> :REQUISICAO_ID),0)  as saldo,
                    y.enderecamento_id,
                    coalesce((select first 1 k.id from TBREMESSA_ITEM_PROCESSADO k where k.remessa = v.remessa_id and k.controle = v.remessa_talao_id ),0) as TALAO_ID,
                    x.remessa,
                    x.produto_codigo,

                    p.descricao as PRODUTO,
                    (select first 1 g.subgrupo||'-'||g.subgrupo from tbenderecamento g where g.id = y.enderecamento_id) as enderecamento,
                    fn_parametro('SISTEMA.LOCALIZACAO_PLACAS') as LOCALIZACAO_CODIGO,
                    x.estabelecimento_codigo

                from tbproduto p, tbproduto l, TBREMESSA_ITEM_PROCESSADO X, TBPEDIDO_ITEM_PROCESSADO y, tbremessa_consumo c, tbremessa_consumo_vinculo v
                WHERE p.codigo = x.produto_codigo
                and p.modelo_codigo = l.modelo_codigo
                and l.codigo = fn_parametro('SISTEMA.PRODUTO_TALAO_PLACA')
                and y.status_saldo = 1
                and x.situacao = 3
                and y.remessa = x.remessa
                and y.remessa_acumulado_controle = x.controle
                and x.produto_codigo = :PRODUTO_CODIGO
                and c.remessa = y.remessa
                and c.talao = y.remessa_acumulado_controle
                and v.consumo_id = c.id
            ) j where j.saldo > 0

            order by j.id
        into
            PECA_ID,
            PECA_SALDO,
            PECA_ENDERECAMENTO_ID,
            PECA_TALAO_ID,
            PECA_REMESSA_ID,
            PECA_PRODUTO_ID,
            PECA_PRODUTO,
            PECA_ENDERECAMENTO,
            PECA_LOCALIZACAO,
            PECA_ESTABELECIMENTO
        do begin    
            suspend;
        end
    end

end;

