ALTER TABLE TBREQUISICAO_PLACA_ALOCACAO
    ADD ESPESSURA NUMERIC(15,4),
    ADD DENSIDADE NUMERIC(15,4);
	
CREATE OR ALTER FUNCTION FN_DENSIDADE_ESPESSURA_V3 (
    MODELO_CODIGO INTEGER,
    COR_CODIGO INTEGER)
RETURNS VARCHAR(30)
AS
declare variable TBM varchar(30);
declare variable ESPESSURA numeric(18,8);
declare variable DENSIDADE numeric(18,8);
begin

    TBM = coalesce((SELECT FIRST 1
      COALESCE((SELECT FIRST 1 M.DENSIDADE||'|'||M.ESPESSURA
         FROM TBMODELO M WHERE M.CODIGO = P2.MODELO_CODIGO),'0000000000')
      FROM TBMODELO_CONSUMO_COR MC, TBFAMILIA F, TBPRODUTO P2
     WHERE MC.MODELO_ID = :MODELO_CODIGO
       AND MC.COR_ID = :COR_CODIGO
       AND MC.PRODUTO_ID = P2.CODIGO
       AND P2.FAMILIA_CODIGO = F.CODIGO
       AND F.DENSIDADE_ESPESSURA = '1'),'0|0');

    if(TBM = '0|0')then
    begin
        for
            SELECT FIRST 1
                M.DENSIDADE,
                M.ESPESSURA
            FROM TBMODELO M
                WHERE M.CODIGO = :MODELO_CODIGO
        into
            :DENSIDADE,
            :ESPESSURA
        do begin
            if(:DENSIDADE > 0 or :ESPESSURA > 0)then
            begin
                TBM = :DENSIDADE||'|'||:ESPESSURA;
            end
        end
    end

    return TBM;
       
end;

CREATE OR ALTER trigger tbrequisicao_placa_bi0 for tbrequisicao_placa
active before insert position 1
AS
declare variable QTD_SALDO_BOJO numeric(15,4);
declare variable QTD_SALDO_BOJO_PARES integer;
declare variable PECA_DENSIDADE numeric(18,4);
declare variable PECA_ESPESSURA numeric(18,4);
declare variable PECA_LARGURA numeric(18,4);
declare variable PECA_COMPRIMENTO numeric(18,4);
declare variable PECA_COR_ID integer;
declare variable PECA_COR_DESCRICAO varchar(100);
declare variable PECA_SALDO numeric(18,4);
declare variable PECA_QTD_PARES numeric(18,4);
declare variable localixacao_id integer;
declare variable LOCALIZACAO_ID integer;
declare variable estabelecimento_id integer;
declare variable QTD_GRAVAR integer;
declare variable PRODUTO_ID integer;
BEGIN

    if( coalesce(new.tipo,0) = 0 )then
    begin
        QTD_SALDO_BOJO = new.quantidade;
    
        for
            select
                PRODUTO_CODIGO,
                DENSIDADE,
                ESPESSURA,
                LARGURA,
                COMPRIMENTO,
                COR_ID,
                COR_DESCRICAO,
                SALDO,
                PACA_QTD_PARES,
                l.codigo as localixacao_id,
                l.estabelecimento_codigo as estabelecimento_id
            from SPC_REQUISICAO_PLACA(new.remessa, new.talao) a, tblocalizacao l
            where saldo > 0
            and l.codigo = fn_parametro('SISTEMA.LOCALIZACAO_PLACAS')
        into
            PRODUTO_ID,
            PECA_DENSIDADE,
            PECA_ESPESSURA,
            PECA_LARGURA,
            PECA_COMPRIMENTO,
            PECA_COR_ID,
            PECA_COR_DESCRICAO,
            PECA_SALDO,
            PECA_QTD_PARES,
            LOCALIZACAO_ID,
            ESTABELECIMENTO_ID
        do begin
    
           if( QTD_SALDO_BOJO > 0 )then
           begin
                if(QTD_SALDO_BOJO <= PECA_SALDO)then
                begin
                    QTD_GRAVAR      = QTD_SALDO_BOJO;
                    QTD_SALDO_BOJO  = 0;
                end else
                begin
                    QTD_SALDO_BOJO = QTD_SALDO_BOJO - PECA_SALDO;
                    QTD_GRAVAR = PECA_SALDO;
                end
    
                INSERT INTO TBREQUISICAO_PLACA_ALOCACAO (
                    PRODUTO_ID, QTD, SALDO, REQUISICAO_PLACA_ID, ESTABELECIMENTO_ID, LOCALIZACAO_ID, DENSIDADE, ESPESSURA
                ) VALUES (
                    :PRODUTO_ID, :QTD_GRAVAR, :QTD_GRAVAR, new.ID, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, new.densidade, new.espessura
                );
           end
        end
    
        if(QTD_SALDO_BOJO > 0)then
        begin
            exception "..." 'Sem saldo para alocação';
        end
    end
END;


CREATE OR ALTER trigger ttbrequisicao_placa_aloc_biu_01 for tbrequisicao_placa_alocacao
active before insert or update position 0
AS
declare variable DEN numeric(15,4);
declare variable ESP numeric(15,4);
declare variable densidade numeric(15,4);
declare variable espessura numeric(15,4);
begin

    select first 1
        coalesce(cast(fn_array(DENESP,1,'|') as numeric(15,4)),0) as DEN,
        coalesce(cast(fn_array(DENESP,2,'|') as numeric(15,4)),0) as ESP
    from(
        select
            fn_densidade_espessura_v3(p.modelo_origem,p.cor_codigo) as DENESP
        from tbproduto p
        where p.codigo = new.produto_id
    ) a into DEN, ESP;

    DEN = coalesce(DEN,0);
    ESP = coalesce(ESP,0);

    if((DEN is distinct from new.densidade) or (ESP is distinct from new.espessura) )then
    begin
        exception "..." 'Erro ao alocar placas, Densidade:'||coalesce(densidade,0)||' -> '||DEN||' e Espessura:'||coalesce(espessura,0)||' -> '||ESP||'.';
    end

end;


