/********** Inativação das triggers de bloqueio ************/

ALTER TRIGGER TTBFAMILIA00IU INACTIVE;
ALTER TRIGGER TTBFAMILIA_B0IU INACTIVE;
ALTER TRIGGER TTBFAMILIA_B1U INACTIVE;
ALTER TRIGGER TTBFAMILIA_B9U INACTIVE;
ALTER TRIGGER TTBFAMILIA_999 INACTIVE;

ALTER TRIGGER TTBMODELO00IU INACTIVE;
ALTER TRIGGER TTBMODELO_B01IU INACTIVE;
ALTER TRIGGER TTMODELO_B0U_01 INACTIVE;
ALTER TRIGGER TTMODELO_B1U_01 INACTIVE;
ALTER TRIGGER TTBMODELO_B08UI INACTIVE;
ALTER TRIGGER TTBMODELO_B10U INACTIVE;
ALTER TRIGGER TTMODELO_B9U INACTIVE;
ALTER TRIGGER TTBMODELO_BIUD998 INACTIVE;
ALTER TRIGGER TTBMODELO_999 INACTIVE;
ALTER TRIGGER TTBMODELO_BIUD_API INACTIVE;

ALTER TRIGGER TTBPRODUTO_B03IU INACTIVE;
ALTER TRIGGER TTBPRODUTO_B0U_01 INACTIVE;
ALTER TRIGGER TTBPRODUTO_B1U INACTIVE;
ALTER TRIGGER TTBPRODUTO_BIU2 INACTIVE;
ALTER TRIGGER TTBPRODUTO_BIU5 INACTIVE;
ALTER TRIGGER TTBPRODUTO_B9U INACTIVE;
ALTER TRIGGER TTBPRODUTO_B01U INACTIVE;
ALTER TRIGGER TTBPRODUTO_999 INACTIVE;
ALTER TRIGGER TTBPRODUTO_BIUD_API INACTIVE;

ALTER TRIGGER TTBNFS_ITEM_B0U_01 INACTIVE;
ALTER TRIGGER TTBNFS_ITEM_B1U INACTIVE;
ALTER TRIGGER TTBNFS_ITEM_BU4 INACTIVE;
ALTER TRIGGER TTBNFS_ITEM_B2U INACTIVE;
ALTER TRIGGER TTBNFS_ITEM_B3I INACTIVE;
ALTER TRIGGER TBNFS_ITEM_B04U INACTIVE;
ALTER TRIGGER TBNFS_ITEM_B06IU INACTIVE;
ALTER TRIGGER TBNFS_ITEM_B07IU INACTIVE;
ALTER TRIGGER TTBNFS_ITEM_B08U INACTIVE;
ALTER TRIGGER TTBNFS_ITEM_999 INACTIVE;

ALTER TRIGGER TTBNFE_ITEM_B0U_01 INACTIVE;
ALTER TRIGGER TTBNFE_ITEM_B10U INACTIVE;
ALTER TRIGGER TTBNFE_ITEM_B2U INACTIVE;
ALTER TRIGGER TTBNFE_ITEM_B2U_01 INACTIVE;
ALTER TRIGGER TTBNFE_ITEM_B3U INACTIVE;
ALTER TRIGGER TTBNFE_ITEM_B4U INACTIVE;
ALTER TRIGGER TBNFE_ITEM_B07IU INACTIVE;
ALTER TRIGGER TBNFE_ITEM_B08IU INACTIVE;
ALTER TRIGGER TTBNFE_ITEM_B09U INACTIVE;
ALTER TRIGGER TTBNFE_ITEM_999 INACTIVE;

ALTER TRIGGER TBOC_ITEM_B05UI INACTIVE;
ALTER TRIGGER TTBOC_ITEM_999 INACTIVE;
ALTER TRIGGER TTBOC_ITEM_B1U_01 INACTIVE;
ALTER TRIGGER TTBOC_ITEM_B04U INACTIVE;
ALTER TRIGGER TTBOC_ITEM_B0IU_01 INACTIVE;

ALTER TRIGGER TTBPEDIDO_ITEM_999 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B0U_02 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B0U_01 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B0U_00 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM00IU INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B3U_02 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B4U_01 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_BU_11 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_BIUD998 INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B10U INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B1U INACTIVE;
ALTER TRIGGER TTBPEDIDO_ITEM_B9U INACTIVE;

ALTER TRIGGER TTBPDV_CFE_ITEM_B09U INACTIVE;
ALTER TRIGGER TTBPDV_CFE_ITEM_999 INACTIVE;

/********** Criação dos campos de backup ************/

ALTER TABLE TBFAMILIA ADD UNIDADEMEDIDA_SIGLA2 VARCHAR(3);
ALTER TABLE TBFAMILIA ADD UNIDADEMEDIDA_ALTERNATIVO2 VARCHAR(3);
ALTER TABLE TBMODELO ADD UNIDADEMEDIDA_SIGLA2 VARCHAR(3);
ALTER TABLE TBPRODUTO ADD UNIDADEMEDIDA_SIGLA2 VARCHAR(3);
ALTER TABLE TBNFS_ITEM ADD UM_ALTERNATIVA2 VARCHAR(3);
ALTER TABLE TBNFS_ITEM ADD PRODUTO_UNIDADEMEDIDA2 VARCHAR(3);
ALTER TABLE TBNFE_ITEM ADD UM_ALTERNATIVA2 VARCHAR(3);
ALTER TABLE TBNFE_ITEM ADD PRODUTO_UNIDADEMEDIDA2 VARCHAR(3);
ALTER TABLE TBOC_ITEM ADD UM_ALTERNATIVA2 VARCHAR(3);
ALTER TABLE TBPEDIDO_ITEM ADD UM_ALTERNATIVA2 VARCHAR(3);
ALTER TABLE TBPDV_CFE_ITEM ADD UM2 VARCHAR(3);

/********** Backup dos valores dos campos originais nos campos de backup ************/

UPDATE TBFAMILIA SET UNIDADEMEDIDA_SIGLA2 = UNIDADEMEDIDA_SIGLA;    
UPDATE TBFAMILIA SET UNIDADEMEDIDA_ALTERNATIVO2 = UNIDADEMEDIDA_ALTERNATIVO;
UPDATE TBMODELO SET UNIDADEMEDIDA_SIGLA2 = UNIDADEMEDIDA_SIGLA;
UPDATE TBPRODUTO SET UNIDADEMEDIDA_SIGLA2 = UNIDADEMEDIDA_SIGLA;
UPDATE TBNFS_ITEM SET UM_ALTERNATIVA2 = UM_ALTERNATIVA;
UPDATE TBNFS_ITEM SET PRODUTO_UNIDADEMEDIDA2 = PRODUTO_UNIDADEMEDIDA;
UPDATE TBNFE_ITEM SET UM_ALTERNATIVA2 = UM_ALTERNATIVA;
UPDATE TBNFE_ITEM SET PRODUTO_UNIDADEMEDIDA2 = PRODUTO_UNIDADEMEDIDA;
UPDATE TBOC_ITEM SET UM_ALTERNATIVA2 = UM_ALTERNATIVA;
UPDATE TBPEDIDO_ITEM SET UM_ALTERNATIVA2 = UM_ALTERNATIVA;
UPDATE TBPDV_CFE_ITEM SET UM2 = UM;

/*********** Realocação das dependencias ************/

SET TERM ^ ;

CREATE OR ALTER procedure SP_GERAR_TALAO (
    UP_ID integer,
    GP_ID integer,
    TALAO integer,
    REMESSA_ID integer,
    MODELO_ID integer,
    COR_ID integer,
    QUANTIDADE numeric(15,4),
    TAMANHO integer,
    LOCALIZACAO_ID integer,
    TRANSACAO_ID integer,
    DATA date,
    DATA2 timestamp)
as
declare variable NOVA_REMESSA integer;
declare variable ANO integer;
declare variable MES integer;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID varchar(10);
declare variable ABREVGP varchar(10);
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable QUANTIDADE_PRODUCAO numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable ESPESSURA numeric(15,4);
declare variable DENSIDADE numeric(15,4);
declare variable PRODUTO_ID integer;
declare variable UM varchar(10);
declare variable UMA varchar(10);
declare variable FATOR numeric(15,4);
declare variable LINHA_CODIGO integer;
declare variable DENSIDADE_ESPESSURA integer;
declare variable ITEM_PROCESSADO integer;
declare variable PERFIL_SKU varchar(10);
declare variable PROGRAMACAO_ID integer;
declare variable TEMPO_TOTAL numeric(18,8);
declare variable TEMPO_SETUP numeric(18,8);
declare variable AUTORIZACAO varchar(300);
declare variable GERAR_TALOES integer;
declare variable USUARIO_NOTIFICAR integer;
declare variable CORPO1 blob sub_type 1 segment size 80;
declare variable HISTORICO varchar(500);
declare variable TALAO_ID integer;
begin

    ESTABELECIMENTO_CODIGO = 1;
    
    -- ################################ - talao acumulado - ########################################

    DATA2 = cast( DATA || ' 07:30' as timestamp);

    select
        p.codigo,
        f.unidademedida_sigla2,
        f.unidademedida_alternativo2,
        m.linha_codigo,
        m.densidade,
        m.espessura,
        f.densidade_espessura,
        p.familia_codigo
    from tbproduto p, tbfamilia f, tbmodelo m
        where p.modelo_codigo = :modelo_id
        and p.cor_codigo = :cor_id
        and f.codigo = p.familia_codigo
        and m.codigo = :modelo_id
        and p.status = '1'
        and m.status = '1'
        and f.status = '1'
    into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura, familia_id;

    produto_id = coalesce(produto_id,0);

    if(produto_id > 0)then
    begin
    
        quantidade_producao    = :quantidade;
        quantidade_alternativa = 0;
        fator                  = coalesce(fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', :linha_codigo),0);
    
    
        if(char_length(trim(uma)) > 0)then
        begin
    
            if(fator = 0)then
            begin
              exception "..." 'Família com unidade de medida alternativa, mais fator não foi encontrado na linha. Linha:'||:linha_codigo||', Parametro:604 da linha.';
            end
    
            quantidade_producao    = :quantidade / fator;
            quantidade_alternativa = :quantidade;
        end
    
        if(coalesce(densidade_espessura,0) = 0)then
        begin
            Select
                Cast(Substring(Dens_Esp from 1 for 5) as Integer) Densidade,
                Cast(Substring(Dens_Esp from 6 for 5) as Numeric(15,2)) Espessura
            From (
                Select First 1
                Coalesce((Select First 1 lPad(M.Densidade,5,'0')||lPad(M.Espessura,5,'0')
                From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000') Dens_Esp
                From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                Where MC.Modelo_Id = :modelo_id
                and MC.Cor_Id = :cor_id
                and MC.Produto_Id = P2.Codigo
                and P2.Familia_Codigo = F.Codigo
                and F.Densidade_Espessura = '1'
                and((:tamanho = 1 and MC.T01 > 0) or
                (:tamanho = 2 and MC.T02 > 0) or
                (:tamanho = 3 and MC.T03 > 0) or
                (:tamanho = 4 and MC.T04 > 0) or
                (:tamanho = 5 and MC.T05 > 0) or
                (:tamanho = 6 and MC.T06 > 0) or
                (:tamanho = 7 and MC.T07 > 0) or
                (:tamanho = 8 and MC.T08 > 0) or
                (:tamanho = 9 and MC.T09 > 0) or
                (:tamanho =10 and MC.T10 > 0) or
                (:tamanho =11 and MC.T11 > 0) or
                (:tamanho =12 and MC.T12 > 0) or
                (:tamanho =13 and MC.T13 > 0) or
                (:tamanho =14 and MC.T14 > 0) or
                (:tamanho =15 and MC.T15 > 0) or
                (:tamanho =16 and MC.T16 > 0) or
                (:tamanho =17 and MC.T17 > 0) or
                (:tamanho =18 and MC.T18 > 0) or
                (:tamanho =19 and MC.T19 > 0) or
                (:tamanho =20 and MC.T20 > 0))
            ) into densidade, espessura;
    
        end
    
        TALAO_ID = GEN_ID(GTBREMESSA_ITEM_PROCESSADO,1);
    
        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            REMESSA,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            MATRIZ_CODIGO,
            OPERADOR_CODIGO,
            PRODUTO_CODIGO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_PRODUCAO,
            HORA_LIBERACAO,
            TAMANHO,
            QUANTIDADE,
            CHAPAS,
            PLACAS,
            SOBRAS,
            CONSUMO_MEDIO,
            OBSERVACAO,
            SITUACAO,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            ESPESSURA,
            SOBRAS_,
            PLACAS_,
            DENSIDADE,
            TOLERANCIA,
            OPERADOR_LIBERACAO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PLANOMESTRE_ID,
            LIB,
            UP_ID,
            OPERADOR_PRODUCAO,
            LOCALIZACAO_ID,
            TURNO,
            REQUISICAO_ID,
            PERC_SOBRA,
            QUANTIDADE_SOBRA,
            APROVEITAMENTO,
            ESTOQUE_ID,
            SEQ,
            ID,
            DATAHORA,
            QUANTIDADE_ALTERNATIVA,
            VIA_ETIQUETA,
            OPERADOR_GP,
            PERCENTUAL_TALAO_EXTRA,
            TALAO_EXTRA,
            TALAO_VINCULO,
            FERRAMENTA_ID,
            REPROCESSAR,
            FLAG_DATA,
            PERFIL
        ) VALUES (
            :remessa_id,
            :TALAO,
            :ESTABELECIMENTO_CODIGO,
            0,
            :modelo_id,
            NULL,
            NULL,
            :produto_id,
            :DATA,
            :DATA,
            :DATA2,
            :DATA2,
            :tamanho,
            :quantidade_producao,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            3,
            0,
            0,
            coalesce(:espessura,0),
            NULL,
            NULL,
            coalesce(:densidade,0),
            NULL,
            0,
            :gp_id,
            1,
            0,
            '1',
            :up_id,
            NULL,
            0,
            '',
            0,
            0,
            0,
            0,
            0,
            '',
            :TALAO_ID,
            current_timestamp,
            :quantidade_alternativa,
            0,
            0,
            NULL,
            NULL,
            NULL,
            NULL,
            0,
            0,
            NULL
        );
    
        --############################### - talao detalhado - ########################################
    
        ITEM_PROCESSADO = GEN_ID(GERADOR1_ID,1);
    
        localizacao_id = coalesce((select first 1 f.localizacao_codigo from TBFAMILIA f where f.codigo = :familia_id),0);
    
        :perfil_sku    = coalesce((select first 1 k.perfil from vwsku k where k.modelo_id = :modelo_id and k.cor_id = :cor_id and k.tamanho = :tamanho),'');
    
        if(:perfil_sku = '')then
        begin
            exception "..." 'Erro ao consultar perfil do produto '||:produto_id;
        end
    
        INSERT INTO TBPEDIDO_ITEM_PROCESSADO (
            PEDIDO_ITEM_CONTROLE,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            CLIENTE_CODIGO,
            PEDIDO,
            REMESSA,
            REMESSA_ACUMULADO_CONTROLE,
            TURNO_LIBERACAO,
            TURNO_PRODUCAO,
            ESTEIRA_LIBERACAO,
            ESTEIRA_PRODUCAO,
            SETOR_CODIGO,
            PRODUTO_CODIGO,
            EXPEDICAO_PRODUTO_CODIGO,
            DATA_PROCESSAMENTO,
            DATA_EXPEDICAO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_EXPEDICAO,
            HORA_LIBERACAO,
            HORA_PRODUCAO,
            LOTE,
            TAMANHO,
            QUANTIDADE_PEDIDO,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
            SITUACAO,
            OPERADOR_ID_PRODUCAO,
            OPERADOR,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            PROGRAMACAO_TURNO,
            COR_ID,
            VOLUME,
            PECA_CONJUNTO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            VIA_ETIQUETA,
            LIB,
            LOCALIZACAO_CODIGO,
            REG_ESTOQUE,
            STATUS_PRODUCAO,
            AGRUPAMENTO_ID,
            COLETA_ID,
            ESTOQUE_ID,
            DATAHORA,
            QUANTIDADE_PRODUCAO_TMP,
            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            QUANTIDADE_ALTERN_PRODUCAO_TMP,
            QUANTIDADE_SOBRA_TMP,
            QUANTIDADE_SOBRA,
            ESTOQUE_ID_BAIXA,
            QUANTIDADE_BAIXA,
            TURNO,
            ACRESCIMO,
            TALAO_DESMEMBRAMENTO,
            ESTOQUE_ID_S_TRANSF,
            ESTOQUE_ID_E_TRANSF,
            MOTIVO_BAIXA,
            TIPO_BAIXA,
            CCUSTO_BAIXA,
            OBSERVACAO,
            FERRAMENTA_ID,
            ENDERECAMENTO_ID,
            FLAG_DATA,
            MOTIVO_BAIXA_ID,
            PERFIL
        )VALUES (
            0,
            :ITEM_PROCESSADO,
            :estabelecimento_codigo,
            :familia_id,
            :modelo_id,
            NULL,
            NULL,
            :remessa_id,
            :TALAO,
            NULL,
            1,
            NULL,
            :GP_ID,
            NULL,
            :produto_id,
            NULL,
            NULL,
            :DATA,
            :DATA,
            :DATA,
            :DATA2,
            :DATA2,
            :DATA2,
            NULL,
            :tamanho,
            :quantidade_producao,
            :quantidade_producao,
            :quantidade_producao,
            3,
            NULL,
            NULL,
            0,
            0,
            0,
            :cor_id,
            0,
            1,
            :gp_id,
            1,
            0,
            '0',
            :localizacao_id,
            '0',
            '0',
            0,
            NULL,
            0,
            current_timestamp,
            :quantidade_producao,
            :quantidade_alternativa,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            NULL,
            NULL,
            :TRANSACAO_ID,
            '',
            '',
            '',
            NULL,
            NULL,
            NULL,
            0,
            0,
            :perfil_sku
        );
    
        update TBPEDIDO_ITEM_PROCESSADO t set t.localizacao_codigo = :localizacao_id where t.controle = :ITEM_PROCESSADO;
    end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_FDI (
    DATA_1 date,
    DATA_2 date,
    ESTABELECIMENTO_ID integer)
returns (
    ESTABELECIMENTO varchar(200),
    MESANO varchar(20),
    OPERACAO_FDI varchar(20),
    FAMILIA_CODIGO integer,
    FAMILIA_DESCRICAO varchar(200),
    PROD numeric(15,4),
    FAT numeric(15,4),
    VALOR_UNITARIO numeric(15,4),
    VALOR numeric(15,4))
as
begin
  FOR Select (Select First 1 E.RazaoSocial From TbEstabelecimento E Where E.Codigo = :ESTABELECIMENTO_ID) Estabelecimento,
        (Case When (Extract(Month from Z.Data1)) = 1 Then 'JANEIRO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 2 Then 'FEVEREIRO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 3 Then 'MARÇO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 4 Then 'ABRIL/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 5 Then 'MAIO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 6 Then 'JUNHO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 7 Then 'JULHO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 8 Then 'AGOSTO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 9 Then 'SETEMBRO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 10 Then 'OUTUBRO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 11 Then 'NOVEMBRO/'||Extract(Year from Z.Data1) else
        Case When (Extract(Month from Z.Data1)) = 12 Then 'DEZEMBRO/'||Extract(Year from Z.Data1) else ''
        END END END END END END END END END END END END) MesAno,
        (Select First 1 U.Valor_ext From TbControle_N U Where U.id = 51) Operacao_FDI,
        Z.Familia_Inventario as Familia_Codigo,
        (Select First 1 F.Descricao||'/'||F.UnidadeMedida_Sigla2 From TbFamilia F
        Where Z.Familia_Inventario = F.Codigo) Familia_Descricao,
        Cast(Sum(Z.Quantidade_Produzida) as Numeric(15,4)) Prod, Cast(Sum(Z.Quantidade_Faturada) as Numeric(15,4)) Fat,
        Cast((Case When Sum(Z.Quantidade_Faturada) > 0 Then Sum(Z.Valor_Total)/Sum(Z.Quantidade_Faturada) else 0 end) as Numeric(15,4)) Valor_Unitario,
        Cast(Sum(Z.Valor_Total) as Numeric(15,4)) Valor
        From (
                    Select P.Familia_Inventario, Sum(A.Quantidade) as Quantidade_Produzida, 0 Quantidade_Faturada, 0 Valor_Total, Cast(:DATA_1 as Date) Data1
                    From TbEstoque_Transacao_Item A, TbProduto P
                    Where A.Estabelecimento_Codigo = :ESTABELECIMENTO_ID
                    and A.Data BetWeen :DATA_1 and :DATA_2
                    and A.Operacao_Codigo = (Select First 1 U.Valor_ext From TbControle_N U Where U.id = 30)
                    and A.Produto_Codigo = P.Codigo
                    and P.Familia_Inventario not in (7, 147) /* Despesas e Fitness */
                    Group By 1

                    Union
                    Select P.Familia_Inventario, 0 Quantidade_Produzida, Sum(N.Quantidade) Quantidade_Faturada, Sum(N.Valor_Total+N.Valor_Acrescimo-N.Valor_Desconto+N.Valor_Ipi+N.Valor_Frete) Valor_Total, Cast(:Data_1 as Date) Data1
                    From TbNfs F, TbNfs_Item N, TbOperacao O, TbProduto P , TBFAMILIA FF, TBCFOP C
                    Where N.Estabelecimento_Codigo = :ESTABELECIMENTO_ID
                    and N.Operacao_Codigo = O.Codigo
                    and F.Controle = N.Nfs_Controle
                    and F.Natureza = 1 and F.Situacao = 2
                    and N.Data_Emissao BetWeen :DATA_1 and :DATA_2
                    and N.Produto_Codigo = P.Codigo
                    and N.Situacao = 1
                    and N.Numero_NotaFiscal > 0
                    AND P.FAMILIA_INVENTARIO = FF.CODIGO
                    AND N.CFOP_CODIGO = C.CODIGO
                    /*and N.Cfop_Codigo in ('5.101','5.111','5.112','5.118','5.122','5.401','5.927','6.101','6.102','6.107','6.111','6.112','6.118','6.122','7.101','6.501')*/
                    /*and N.operacao_codigo not in ('CIC','VBA','VPR')*/
                    /*and P.Familia_Inventario not in (7, 147)*/ /* Despesas e Fitness */
                    AND C.FDI = '1'
                    AND FF.FDI = '1'
                    AND O.FDI = '1'
                    Group By 1

                    Union

                    SELECT P.FAMILIA_INVENTARIO, 0 QUANTIDADE_PRODUZIDA,
                    SUM(B.QUANTIDADE) QUANTIDADE_FATURADA,
                    SUM(B.VALOR_TOTAL) VALOR_TOTAL,
                    CAST(:DATA_1 AS DATE) DATA1
                    FROM TBPDV_CFE A, TBPDV_CFE_ITEM B, TBOPERACAO O, TBPRODUTO P, TBFAMILIA FF, TBCFOP C
                    WHERE A.ID = B.PDV_CFE_ID
                    AND A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    AND A.DATA_EMISSAO BETWEEN :DATA_1 AND :DATA_2
                    AND A.SITUACAO = 2
                    AND P.CODIGO = B.PRODUTO_ID
                    AND P.FAMILIA_INVENTARIO = FF.CODIGO
                    AND B.CFOP_CODIGO = C.CODIGO
                    AND B.OPERACAO_CODIGO = O.CODIGO
                    /*and b.Cfop_Codigo in ('5.101','5.111','5.112','5.118','5.122','5.401','5.927','6.101','6.102','6.107','6.111','6.112','6.118','6.122','7.101','6.501')*/
                    /*and b.operacao_codigo not in ('CIC','VBA','VPR')*/
                    /*AND P.FAMILIA_INVENTARIO NOT IN (7, 147)*/ /* DESPESAS E FITNESS */
                    AND C.FDI = '1'
                    AND FF.FDI = '1'
                    AND O.FDI = '1'
                    GROUP BY 1
                    
                    ) Z

        Group By 1,2,3,4
        Having (Sum(Z.VALOR_TOTAL) > 0) or (Sum(Z.VALOR_TOTAL) > 0)
        Order By 5

  INTO
      :ESTABELECIMENTO,
      :MESANO,
      :OPERACAO_FDI,
      :FAMILIA_CODIGO,
      :FAMILIA_DESCRICAO,
      :PROD,
      :FAT, 
      :VALOR_UNITARIO,
      :VALOR

DO suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORM_MODELO (
    STATUS_1 char(1),
    DESCRICAO_1 varchar(100))
returns (
    CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA char(3),
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select A.CODIGO, A.DESCRICAO, B.UNIDADEMEDIDA_SIGLA2, A.Grade_Codigo,
           0 MODELO_CODIGO, 0 LOCALIZACAO_CODIGO,
       (Select C.Descricao From TbFamilia C Where C.Codigo = A.Familia_Codigo)

From TbModelo A
Left Join TbFamilia B On A.Familia_Codigo = B.CODIGO
Where A.Status = :Status_1
  and A.Descricao like :Descricao_1
Order by A.familia_codigo,  A.Descricao
INTO
   :CODIGO,
   :DESCRICAO,
   :UNIDADEMEDIDA_SIGLA,
   :GRADE_CODIGO,
   :modelo_codigo, 
   :LOCALIZACAO_CODIGO,
   :familia_descricao
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbmodelo_cor_ai0_01 for tbmodelo_cor
active after insert position 0
AS
DECLARE VARIABLE Cod  Integer;
DECLARE VARIABLE Mask VarChar(200);
DECLARE VARIABLE UM   VarChar(3);
DECLARE VARIABLE Fam  Integer;
DECLARE VARIABLE Fam_Alt Integer;
DECLARE VARIABLE Grd  Integer;
DECLARE VARIABLE Loc  Integer;
DECLARE VARIABLE Tip  Integer;
DECLARE VARIABLE Ncm  VarChar(10);
DECLARE VARIABLE Lin  Integer;
DECLARE VARIABLE HCom Char(1);
DECLARE VARIABLE HVen Char(1);
DECLARE VARIABLE dMod VarChar(50);
DECLARE VARIABLE dFam VarChar(20);
DECLARE VARIABLE dCor VarChar(20);
DECLARE VARIABLE Prd  Integer;
Begin
For
Select M.tipoproduto_codigo, M.familia_codigo, m.familia_alternativa, M.linha_codigo, M.grade_codigo, F.localizacao_codigo,
       IIF(char_length(Coalesce(M.UnidadeMedida_Sigla2,''))>0,M.UnidadeMedida_Sigla2,F.UnidadeMedida_Sigla2),
       F.ncm_codigo, F.habilita_compra, F.habilita_venda, F.mascara_produto,
       M.Descricao, F.Descricao,
      (Select First 1 C.Descricao From TbCor C Where C.Codigo = New.Cor_Id),
       Coalesce((Select First 1 P.Codigo From TbProduto P
                  Where P.Modelo_Codigo = New.Modelo_Id
                    and P.Cor_Codigo = New.Cor_Id),0)
From TbModelo M, TbFamilia F
Where M.Codigo = New.Modelo_Id
  and M.Familia_Alternativa = F.Codigo

Into :Tip,:Fam,:Fam_Alt,:Lin,:Grd,:Loc,:UM,:Ncm,:HCom,:HVen,:Mask,:dMod, :dFam, :dCor, :Prd
Do
    begin
     if (:Prd = 0) then
          Begin
          MASK = Replace(:MASK,'#FAMILIA_ID',fn_lPad(:FAM_ALT,4,'0'));
          MASK = Replace(:MASK,'#FAMILIA_DESCRICAO',:DFAM);
          MASK = Replace(:MASK,'#MODELO_ID',fn_lPad(NEW.MODELO_ID,4,'0'));
          MASK = Replace(:MASK,'#MODELO_DESCRICAO',:DMOD);
          MASK = Replace(:MASK,'#COR_ID',fn_lPad(NEW.COR_ID,4,'0'));
          MASK = Replace(:MASK,'#COR_DESCRICAO',dCor);
          COD  = (Select GEN_ID(gtbproduto,1) FROM RDB$DATABASE);
    
    --      IF ( FN_CURRENT_USER_ID() <> 293 ) THEN
    --      BEGIN
              INSERT INTO TBPRODUTO (
              CODIGO,DESCRICAO,CODIGOANTIGO,UNIDADEMEDIDA_SIGLA2,FAMILIA_CODIGO,FAMILIA_ALTERNATIVA,GRADE_CODIGO,
              LOCALIZACAO_CODIGO,TIPOPRODUTO_CODIGO,NCM_CODIGO,EAN,MODELO_CODIGO,COR_CODIGO,
              LINHA_CODIGO,STATUS,USUARIO_CODIGO,DATA,HABILITA_COMPRA,HABILITA_VENDA)
              VALUES (:COD,:MASK,0,:UM,:FAM,:FAM_ALT,:GRD,:LOC,:TIP,:NCM,'',
              NEW.MODELO_ID,NEW.COR_ID,:LIN,COALESCE(NEW.STATUS_PRODUTO,'1'),0,Current_Date,:HCOM,:HVEN);
    --      END
    
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES ('TBPRODUTO', :COD,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
           'Produto incluido via inclusao de Modelo/Cor (Mod.'||NEW.MODELO_ID||'/Cor '||NEW.COR_ID||')');
    
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES ('TBMODELO', NEW.MODELO_ID,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
           'Cor incluida: '||NEW.COR_ID||' - '||:dCor);
          End
      end
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbfamilia_b9u for tbfamilia
inactive before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.DESCRICAO <> NEW.DESCRICAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' DESC.'||OLD.DESCRICAO||'->'||NEW.DESCRICAO;
       END
   if (OLD.DESCRICAO_AMIGAVEL <> NEW.DESCRICAO_AMIGAVEL) THEN
       BEGIN
       HISTORICO = HISTORICO||' DESC.AMIG.'||OLD.DESCRICAO_AMIGAVEL||'->'||NEW.DESCRICAO_AMIGAVEL;
       END
   if (OLD.DESCRICAO_RESUMIDA <> NEW.DESCRICAO_RESUMIDA) THEN
       BEGIN
       HISTORICO = HISTORICO||' AGRUP.CUSTOS:'||OLD.DESCRICAO_RESUMIDA||'->'||NEW.DESCRICAO_RESUMIDA;
       END
   if (OLD.OPERACAO_REQUISICAO <> NEW.OPERACAO_REQUISICAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' OPER.REQ.'||OLD.OPERACAO_REQUISICAO||'->'||NEW.OPERACAO_REQUISICAO;
       END
   IF (OLD.UNIDADEMEDIDA_SIGLA2 <> NEW.UNIDADEMEDIDA_SIGLA2) THEN
       BEGIN
       HISTORICO = HISTORICO||' UM.'||OLD.UNIDADEMEDIDA_SIGLA2||'->'||NEW.UNIDADEMEDIDA_SIGLA2;
       END
   IF (OLD.UNIDADEMEDIDA_ALTERNATIVO2 <> NEW.UNIDADEMEDIDA_ALTERNATIVO2) THEN
       BEGIN
       HISTORICO = HISTORICO||' UM. ALT.'||OLD.UNIDADEMEDIDA_ALTERNATIVO2||'->'||NEW.UNIDADEMEDIDA_ALTERNATIVO2;
       END
   IF (OLD.LOCALIZACAO_CODIGO <> NEW.LOCALIZACAO_CODIGO) THEN
       BEGIN
       HISTORICO = HISTORICO||' LOC.PADR.'||OLD.LOCALIZACAO_CODIGO||'->'||NEW.LOCALIZACAO_CODIGO;
       END
   IF (OLD.TIPOPRODUTO_CODIGO <> NEW.TIPOPRODUTO_CODIGO) THEN
       BEGIN
       HISTORICO = HISTORICO||' TIPO:'||OLD.TIPOPRODUTO_CODIGO||'->'||NEW.TIPOPRODUTO_CODIGO;
       END
   IF (OLD.NCM_CODIGO <> NEW.NCM_CODIGO) THEN
       BEGIN
       HISTORICO = HISTORICO||' NCM:'||OLD.NCM_CODIGO||'->'||NEW.NCM_CODIGO;
       END
   IF (OLD.CEST <> NEW.CEST) THEN
       BEGIN
       HISTORICO = HISTORICO||' CEST:'||OLD.CEST||'->'||NEW.CEST;
       END
   IF (OLD.HABILITA_COMPRA <> NEW.HABILITA_COMPRA) THEN
       BEGIN
       HISTORICO = HISTORICO||' HAB.COMP.'||OLD.HABILITA_COMPRA||'->'||NEW.HABILITA_COMPRA;
       END
   IF (OLD.HABILITA_VENDA <> NEW.HABILITA_VENDA) THEN
       BEGIN
       HISTORICO = HISTORICO||' HAB.VEN.'||OLD.HABILITA_VENDA||'->'||NEW.HABILITA_VENDA;
       END
   IF (OLD.HABILITA_REPOSICAO <> NEW.HABILITA_REPOSICAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' HAB.REP.'||OLD.HABILITA_REPOSICAO||'->'||NEW.HABILITA_REPOSICAO;
       END
   IF (OLD.QTD_MIN_FRT_CIF <> NEW.QTD_MIN_FRT_CIF) THEN
       BEGIN
       HISTORICO = HISTORICO||' QTD.MIN.CIF '||OLD.QTD_MIN_FRT_CIF||'->'||NEW.QTD_MIN_FRT_CIF;
       END
   if (OLD.CLASSIFICACAO <> NEW.CLASSIFICACAO) then
       BEGIN
       HISTORICO = HISTORICO||' CLASS.'||OLD.CLASSIFICACAO||'->'||NEW.CLASSIFICACAO;
       END
   IF (OLD.CONTROLE_PATRIMONIO <> NEW.CONTROLE_PATRIMONIO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTR.PATRIM.'||OLD.CONTROLE_PATRIMONIO||'->'||NEW.CONTROLE_PATRIMONIO;
       END
   IF (OLD.INVENTARIO <> NEW.INVENTARIO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTR.INVENT.'||OLD.INVENTARIO||'->'||NEW.INVENTARIO;
       END
   IF (OLD.CONTROLE_REVISAO <> NEW.CONTROLE_REVISAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTR.REV.'||OLD.CONTROLE_REVISAO||'->'||NEW.CONTROLE_REVISAO;
       END
   IF (OLD.UNIDADEMEDIDA_FCI <> NEW.UNIDADEMEDIDA_FCI) THEN
       BEGIN
       HISTORICO = HISTORICO||' UM.FCI:'||OLD.UNIDADEMEDIDA_FCI||'->'||NEW.UNIDADEMEDIDA_FCI;
       END
   IF (OLD.INSUMO_MP_FCI <> NEW.INSUMO_MP_FCI) THEN
       BEGIN
       HISTORICO = HISTORICO||' COMPOE FCI:'||OLD.INSUMO_MP_FCI||'->'||NEW.INSUMO_MP_FCI;
       END
   IF (OLD.MASCARA_PRODUTO <> NEW.MASCARA_PRODUTO) THEN
       BEGIN
       HISTORICO = HISTORICO||' MASCARA PROD:'||OLD.MASCARA_PRODUTO||'->'||NEW.MASCARA_PRODUTO;
       END
   IF (OLD.BLOQUEIA_DUPLICIDADE <> NEW.BLOQUEIA_DUPLICIDADE) THEN
       BEGIN
       HISTORICO = HISTORICO||' BLQ.DUPL.PROD.'||OLD.BLOQUEIA_DUPLICIDADE||'->'||NEW.BLOQUEIA_DUPLICIDADE;
       END
   IF (OLD.TOLERANCIA <> NEW.TOLERANCIA) THEN
       BEGIN
       HISTORICO = HISTORICO||' TOLER.P/COMPRA:'||OLD.TOLERANCIA||'->'||NEW.TOLERANCIA;
       END
   IF (OLD.TOLERANCIA_VENDA <> NEW.TOLERANCIA_VENDA) THEN
       BEGIN
       HISTORICO = HISTORICO||' TOLER.P/VENDA'||OLD.TOLERANCIA_VENDA||'->'||NEW.TOLERANCIA_VENDA;
       END
   IF (OLD.NIVEL <> NEW.NIVEL) THEN
       BEGIN
       HISTORICO = HISTORICO||' ORD.PROC.PROD:'||OLD.NIVEL||'->'||NEW.NIVEL;
       END
   IF (OLD.NIVEL_OC <> NEW.NIVEL_OC) THEN
       BEGIN
       HISTORICO = HISTORICO||' NIV.AUT.OC:'||OLD.NIVEL_OC||'->'||NEW.NIVEL_OC;
       END
   IF (OLD.DENSIDADE_ESPESSURA <> NEW.DENSIDADE_ESPESSURA) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTR.DENS/ESP.'||OLD.DENSIDADE_ESPESSURA||'->'||NEW.DENSIDADE_ESPESSURA;
       END
   IF (OLD.CONTROLE_ORCAMENTARIO <> NEW.CONTROLE_ORCAMENTARIO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTR.ORCAM.'||OLD.CONTROLE_ORCAMENTARIO||'->'||NEW.CONTROLE_ORCAMENTARIO;
       END
   IF (OLD.CORES_BASICAS <> NEW.CORES_BASICAS) THEN
       BEGIN
       HISTORICO = HISTORICO||' COR BAS.'||OLD.CORES_BASICAS||'->'||NEW.CORES_BASICAS;
       END
   IF (OLD.CORES_SOBENCOMENDA <> NEW.CORES_SOBENCOMENDA) THEN
       BEGIN
       HISTORICO = HISTORICO||' COR S.ENC.'||OLD.CORES_SOBENCOMENDA||'->'||NEW.CORES_SOBENCOMENDA;
       END
   IF (OLD.SOBRA_TIPO <> NEW.SOBRA_TIPO) THEN
       BEGIN
       HISTORICO = HISTORICO||' SOB.TIPO '||OLD.SOBRA_TIPO||'->'||NEW.SOBRA_TIPO;
       END
   IF (OLD.TOLERANCIA_TIPO <> NEW.TOLERANCIA_TIPO) THEN
       BEGIN
       HISTORICO = HISTORICO||' TP.TOL.CONS.'||OLD.TOLERANCIA_TIPO||'->'||NEW.TOLERANCIA_TIPO;
       END
   IF (OLD.TOLERANCIA_QTD <> NEW.TOLERANCIA_QTD) THEN
       BEGIN
       HISTORICO = HISTORICO||' QTD.TOL.CONS.'||OLD.TOLERANCIA_QTD||'->'||NEW.TOLERANCIA_QTD;
       END
   IF (OLD.TOLERANCIA_PERC <> NEW.TOLERANCIA_PERC) THEN
       BEGIN
       HISTORICO = HISTORICO||' %TOL.CONS.'||OLD.TOLERANCIA_PERC||'->'||NEW.TOLERANCIA_PERC;
       END

   IF (OLD.CONTROLE_TALAO <> NEW.CONTROLE_TALAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CTR.TAL.'||OLD.CONTROLE_TALAO||'->'||NEW.CONTROLE_TALAO;
       END
   IF (OLD.CONTROLE_ALOCACAO <> NEW.CONTROLE_ALOCACAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' CTR.ALOC.'||OLD.CONTROLE_ALOCACAO||'->'||NEW.CONTROLE_ALOCACAO;
       END
   IF (OLD.GGF <> NEW.GGF) THEN
       BEGIN
       HISTORICO = HISTORICO||' GGF:'||OLD.GGF||'->'||NEW.GGF;
       END
   IF (OLD.GERAR_EAN <> NEW.GERAR_EAN) THEN
       BEGIN
       HISTORICO = HISTORICO||' GERAR.EAN.AUT:'||OLD.GERAR_EAN||'->'||NEW.GERAR_EAN;
       END
   IF (OLD.FEEF <> NEW.FEEF) THEN
       BEGIN
       HISTORICO = HISTORICO||' FEEF: '||OLD.FEEF||'->'||NEW.FEEF;
       END
   IF (OLD.CONTROLE_PECA <> NEW.CONTROLE_PECA) THEN
       BEGIN
       HISTORICO = HISTORICO||' CONTR.EST.P/PECA:'||OLD.CONTROLE_PECA||'->'||NEW.CONTROLE_PECA;
       END
   IF (OLD.COMPOE_CUSTO <> NEW.COMPOE_CUSTO) THEN
       BEGIN
       HISTORICO = HISTORICO||' COMP.CUSTO:'||OLD.COMPOE_CUSTO||'->'||NEW.COMPOE_CUSTO;
       END
   IF (OLD.REPRESENTANTE_COMISSAO <> NEW.REPRESENTANTE_COMISSAO) THEN
       BEGIN
       HISTORICO = HISTORICO||' %COMISS:'||OLD.REPRESENTANTE_COMISSAO||'->'||NEW.REPRESENTANTE_COMISSAO;
       END
   IF (OLD.SEQ_COMPOSICAO_CUSTO <> NEW.SEQ_COMPOSICAO_CUSTO) THEN
       BEGIN
       HISTORICO = HISTORICO||' SEQ.PROD.FINS CUSTO:'||OLD.SEQ_COMPOSICAO_CUSTO||'->'||NEW.SEQ_COMPOSICAO_CUSTO;
       END

   IF (OLD.STATUS <> NEW.STATUS) THEN
       BEGIN
       HISTORICO = HISTORICO||' STATUS:'||OLD.STATUS||'->'||NEW.STATUS;
       END

   IF (OLD.FDI <> NEW.FDI) THEN
       BEGIN
       HISTORICO = HISTORICO||' FDI:'||OLD.FDI||'->'||NEW.FDI;
       END

   IF (OLD.HABILITA_COMPOSICAO_CARGA <> NEW.HABILITA_COMPOSICAO_CARGA) THEN
       BEGIN
       HISTORICO = HISTORICO||' HAB.COMP.CARGA:'||OLD.HABILITA_COMPOSICAO_CARGA||'->'||NEW.HABILITA_COMPOSICAO_CARGA;
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBFAMILIA', OLD.CODIGO,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_consumo_b1u for tbremessa_consumo
active before update position 1
AS
declare variable UMAlternativo VarChar(3);
declare variable PRODUTO_DESCRICAO VARCHAR(150);   
declare variable PRODUTO_INVENTARIO VARCHAR(150);

declare variable qtd_kg Numeric(15,4);
declare variable qtd_ml Numeric(15,4);
declare variable QUANTIDADE_SOBRA NUMERIC(15,4);

declare variable talao_id integer;
declare variable produto_id integer;
declare variable gp_id integer;
declare variable perfil varchar(10);
declare variable quantidade_projetada numeric(15,4);
declare variable fator_unidade numeric(15,4);
declare variable quantidade_produzida numeric(15,4);
declare variable quantidade_utilizada numeric(15,4);
declare variable quantidade_alocada numeric(15,4);
declare variable QUANTIDADE_DEFEITO numeric(15,4);

declare variable tolerancia varchar(500);
declare variable tolerancia_pro_qtd_maior numeric(15,4);
declare variable tolerancia_pro_qtd_menor numeric(15,4);
declare variable tolerancia_con_qtd_maior numeric(15,4);
declare variable tolerancia_con_qtd_menor numeric(15,4);
declare variable tolerancia_tipo_pro varchar(10);
declare variable tolerancia_tipo_con varchar(10);
declare variable tolerancia_tipo varchar(10);
declare variable tolerancia_quantidade_maior numeric(15,4);
declare variable tolerancia_quantidade_menor numeric(15,4);
declare variable sobra_producao integer;
declare variable sobra_consumo integer;
declare variable um varchar(10);
declare variable QTD_MAX numeric(15,4);
declare variable QTD_MIN numeric(15,4);
declare variable QTD numeric(15,4);
declare variable QTD_ALOC numeric(15,4);
declare variable familia_id numeric(15,4);
declare variable CONTROLA_TOLERANCIA integer;
Begin

    familia_id = coalesce((select first 1 r.familia_codigo from tbremessa r where r.numero = new.remessa),0);
    CONTROLA_TOLERANCIA = fn_parametro('TBFAMILIA.TOLERANCIA', familia_id);
    
    if (NEW.CONFERENCIA = '1' AND New.Quantidade_Conferencia <> Old.Quantidade_Conferencia and New.Quantidade_Conferencia > Old.Quantidade_Conferencia and coalesce(new.baixado,0) = 0) then
    begin

        if( coalesce(new.liberar_tolerancia,0) = 0 AND CONTROLA_TOLERANCIA = 1)then
        begin
            SELECT FIRST 1
                   P.DESCRICAO,
                   P.INVENTARIO
              FROM TBPRODUTO P
             WHERE P.CODIGO = NEW.PRODUTO_ID
             INTO
                PRODUTO_DESCRICAO,
                PRODUTO_INVENTARIO
             ;
    
            QUANTIDADE_SOBRA = 0;
    
            UMAlternativo = Coalesce((Select First 1 F.UnidadeMedida_Alternativo2 From TbFamilia F, TbProduto P Where F.Codigo = P.Familia_Codigo and P.Codigo = New.Produto_Id),'');
            qtd_ml        = (New.Quantidade_Conferencia_ML + coalesce(new.quantidade_sobra,0));
            qtd_kg        = (New.quantidade_conferencia    + coalesce(new.quantidade_sobra,0));
            um            = Coalesce((Select First 1 F.unidademedida_sigla2 From TbFamilia F, TbProduto P Where F.Codigo = P.Familia_Codigo and P.Codigo = New.Produto_Id),'');
    
            select
                TALAO_ID,
                PRODUTO_ID,
                GP_ID,
                PERFIL,
                QUANTIDADE_PROJETADA,
                FATOR_UNIDADE,
                QUANTIDADE_PRODUZIDA,
                QUANTIDADE_UTILIZADA,
                QUANTIDADE_ALOCADA,
                QUANTIDADE_DEFEITO
            from SPC_DADOS_CONSUMO(new.id) into
                :TALAO_ID,
                :PRODUTO_ID,
                :GP_ID,
                :PERFIL,
                :QUANTIDADE_PROJETADA,
                :FATOR_UNIDADE,
                :QUANTIDADE_PRODUZIDA,
                :QUANTIDADE_UTILIZADA,
                :QUANTIDADE_ALOCADA,
                :QUANTIDADE_DEFEITO;
    
            TOLERANCIA  = FN_TOLERANCIA_PRODUTO(NEW.PRODUTO_ID, :GP_ID, :PERFIL);
        
            TOLERANCIA_PRO_QTD_MAIOR = fn_json_v3(:TOLERANCIA, 'TOLERANCIA_PRO_QTD_MAIOR' );
            TOLERANCIA_PRO_QTD_MENOR = fn_json_v3(:TOLERANCIA, 'TOLERANCIA_PRO_QTD_MENOR' );
            TOLERANCIA_TIPO_PRO      = fn_json_v3(:TOLERANCIA, 'TOLERANCIA_TIPO_PRO'      );
            TOLERANCIA_CON_QTD_MAIOR = fn_json_v3(:TOLERANCIA, 'TOLERANCIA_CON_QTD_MAIOR' );
            TOLERANCIA_CON_QTD_MENOR = fn_json_v3(:TOLERANCIA, 'TOLERANCIA_CON_QTD_MENOR' );
            TOLERANCIA_TIPO_CON      = fn_json_v3(:TOLERANCIA, 'TOLERANCIA_TIPO_CON'      );
            SOBRA_PRODUCAO           = fn_json_v3(:TOLERANCIA, 'SOBRA_PRODUCAO'           );
            SOBRA_CONSUMO            = fn_json_v3(:TOLERANCIA, 'SOBRA_CONSUMO'            );
    
            IF(TOLERANCIA_TIPO_CON = 'Q')THEN
            BEGIN
                :TOLERANCIA_QUANTIDADE_MAIOR = TOLERANCIA_CON_QTD_MAIOR;
                :TOLERANCIA_QUANTIDADE_MENOR = TOLERANCIA_CON_QTD_MENOR;
                :TOLERANCIA_TIPO = 'Q';
            END ELSE
            BEGIN
                IF(TOLERANCIA_TIPO_CON = 'P')THEN
                BEGIN
                    :TOLERANCIA_QUANTIDADE_MAIOR = (QUANTIDADE_PROJETADA * (TOLERANCIA_CON_QTD_MAIOR / 100.0000));
                    :TOLERANCIA_QUANTIDADE_MENOR = (QUANTIDADE_PROJETADA * (TOLERANCIA_CON_QTD_MENOR / 100.0000));
                    :TOLERANCIA_TIPO = 'P';
                END ELSE
                BEGIN
                    exception "..." 'Tolerância do produto "'||:PRODUTO_ID||' - '||:PRODUTO_DESCRICAO||'" não identificada. (Verificar tolerância no produto e na família)';
                END
            END
    
            /*
            if (Char_Length(:UMAlternativo) > 0 and New.Quantidade_Conferencia_ML > 0) then
            begin
                QTD_MAX     = (New.Consumo_Ml + QUANTIDADE_SOBRA + :TOLERANCIA_QUANTIDADE_MAIOR);
                QTD_MIN     = (New.Consumo_Ml + QUANTIDADE_SOBRA - :TOLERANCIA_QUANTIDADE_MENOR);
                QTD         = (New.Consumo_Ml + QUANTIDADE_SOBRA);
                QTD_ALOC    = New.Quantidade_Conferencia_ML;
            end else
            begin
            */
    
            QTD_MAX     = (New.Consumo_Kg + QUANTIDADE_SOBRA + :TOLERANCIA_QUANTIDADE_MAIOR);
            QTD_MIN     = (New.Consumo_Kg + QUANTIDADE_SOBRA - :TOLERANCIA_QUANTIDADE_MENOR);
            QTD         = (New.Consumo_Kg + QUANTIDADE_SOBRA);
            QTD_ALOC    = New.quantidade_conferencia;
    
            um = ' '||lower(um)||'';
    
            if(not (:QUANTIDADE_UTILIZADA between QTD_MIN and QTD_MAX))then
            begin
                 Exception "..." 'QUANTIDADE DE CONSUMO INFORMADA FORA DA TOLERANCIA PERMITIDA "' || PRODUTO_DESCRICAO || '"! PROJECAO: '|| QTD ||um||' CONSUMO: '||QUANTIDADE_UTILIZADA||um||' TOLERANCIA (MAIS): '||TOLERANCIA_QUANTIDADE_MAIOR||um||' TOLERANCIA (MENOS): '||TOLERANCIA_QUANTIDADE_MENOR||um||' ID: ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
            end
    
            /*
            if( :QUANTIDADE_UTILIZADA > (QTD_ALOC + :TOLERANCIA_QUANTIDADE_MAIOR))then
            begin
                 Exception "..." 'QUANTIDADE DE CONSUMO NÃO PODE SER MAIOR DO QUE O ALOCADO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '|| QTD ||um||' CONSUMO: '||:QUANTIDADE_UTILIZADA||um||' ALOCADO: '||:QTD_ALOC||um||' TOLERANCIA (MAIS): '||TOLERANCIA_QUANTIDADE_MAIOR||um||' TOLERANCIA (MENOS): '||TOLERANCIA_QUANTIDADE_MENOR||um||' ID: ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
            end
            */

            if(new.quantidade_sobra > 0 and SOBRA_CONSUMO = 0)then
            begin
                Exception "..." 'O PRODUTO "' || PRODUTO_DESCRICAO || '" NÃO PERMITE SOBRA DE CONSUMO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
            end

            /*
            if(:QUANTIDADE_PRODUZIDA > 0 and SOBRA_PRODUCAO = 0)then
            begin
                Exception "..." 'O PRODUTO "' || PRODUTO_DESCRICAO || '" NÃO PERMITE SOBRA DE PRODUÇÃO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
            end
            */
    
            if (Char_Length(:UMAlternativo) > 0 and New.Quantidade_Conferencia_ML > 0) then
            begin
                QTD_MAX     = (New.Consumo_Ml + :TOLERANCIA_QUANTIDADE_MAIOR);
                QTD_MIN     = (New.Consumo_Ml - :TOLERANCIA_QUANTIDADE_MENOR);
                QTD         = New.Consumo_Ml;
                QTD_ALOC    = New.Quantidade_Conferencia_ML;
                um          = ' '||lower(UMAlternativo)||'';

                if(not (:QTD_ALOC between QTD_MIN and QTD_MAX))then
                begin
                     --Exception "..." 'QUANTIDADE PRODUZIDA FORA DA TOLERANCIA PERMITIDA "' || PRODUTO_DESCRICAO || '"! PROJECAO: '|| QTD ||um||' PRODUZIDO: '||QTD_ALOC||um||' TOLERANCIA (MAIS): '||TOLERANCIA_QUANTIDADE_MAIOR||um||' TOLERANCIA (MENOS): '||TOLERANCIA_QUANTIDADE_MENOR||um||' ID: ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                end
            end
    

    
            /*
            if (Char_Length(:UMAlternativo) > 0 and New.Quantidade_Conferencia_ML > 0 AND PRODUTO_INVENTARIO = '1' ) then
            begin
    
            if (((New.Quantidade_Conferencia_ML) > (New.Consumo_Ml + QUANTIDADE_SOBRA + :TOLERANCIA_QUANTIDADE_MAIOR)) or ((New.Quantidade_Conferencia_ML) < (New.Consumo_Ml + QUANTIDADE_SOBRA - :TOLERANCIA_QUANTIDADE_MENOR))) then
                begin
                Exception "..." 'QUANTIDADE DE CONSUMO INFORMADA FORA DA TOLERANCIA PERMITIDA "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Ml||' CONSUMO: '||New.Quantidade_Conferencia_Ml||' TOLERANCIA (MAIS): '||TOLERANCIA_QUANTIDADE_MAIOR||' TOLERANCIA (MENOS): '||TOLERANCIA_QUANTIDADE_MENOR||' SOBRA: '||QUANTIDADE_SOBRA||' ID: ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                End
            end else
            Begin
            if (((New.quantidade_conferencia) > (New.Consumo_Kg + QUANTIDADE_SOBRA + :TOLERANCIA_QUANTIDADE_MAIOR)) or ((New.quantidade_conferencia) < (New.Consumo_Kg + QUANTIDADE_SOBRA - :TOLERANCIA_QUANTIDADE_MENOR)))  then
                begin
                Exception "..." 'QUANTIDADE DE CONSUMO INFORMADA FORA DA TOLERANCIA PERMITIDA "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Kg||' CONSUMO: '||New.Quantidade_Conferencia||' TOLERANCIA (MAIS): '||TOLERANCIA_QUANTIDADE_MAIOR||' TOLERANCIA (MENOS): '||TOLERANCIA_QUANTIDADE_MENOR||' SOBRA: '||QUANTIDADE_SOBRA||' ID: ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                End
            End
            */
    
            /*
            tTolerancia = '';
    
            -- Verifica tolerancia por produto
            For
            Select First 1 PF.Tolerancia_Qtd, PF.Tolerancia_Perc, PF.Tolerancia_Tipo
              From TbProduto_Ficha PF Where PF.produto_codigo = New.Produto_Id and PF.Tolerancia_tipo in ('Q','P')
              Into :qTolerancia, :pTolerancia, :tTolerancia
             Do
             Begin
    
                UMAlternativo = Coalesce((Select First 1 F.UnidadeMedida_Alternativo From TbFamilia F, TbProduto P Where F.Codigo = P.Familia_Codigo and P.Codigo = New.Produto_Id),'');
                if (tTolerancia = 'Q') then --Tolerancia em Quantidade
                    Begin
                        qtd_ml = (New.Quantidade_Conferencia_ML + coalesce(new.quantidade_sobra,0));
                        qtd_kg = (New.quantidade_conferencia    + coalesce(new.quantidade_sobra,0));
    
                        if (Char_Length(:UMAlternativo) > 0 and New.Quantidade_Conferencia_ML > 0 AND PRODUTO_INVENTARIO = '1' ) then
                            begin
    
                            if (((New.Quantidade_Conferencia_ML) > (New.Consumo_Ml + QUANTIDADE_SOBRA + :qTolerancia)) or ((New.Quantidade_Conferencia_ML) < (New.Consumo_Ml + QUANTIDADE_SOBRA - :qTolerancia))) then
                                begin
                                Exception "..." 'QUANTIDADE INFORMADA FORA DA TOLERANCIA PERMITIDA PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Ml||' CONSUMO: '||New.Quantidade_Conferencia_Ml||' TOLERANCIA: '||qTolerancia||' SOBRA: '||QUANTIDADE_SOBRA||' ID: ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                                End
                            end else
                            Begin
                            if (((New.quantidade_conferencia) > (New.Consumo_Kg + QUANTIDADE_SOBRA + :qTolerancia)) or ((New.quantidade_conferencia) < (New.Consumo_Kg + QUANTIDADE_SOBRA - :qTolerancia)))  then
                                begin
                                Exception "..." 'QUANTIDADE INFORMADA FORA DA TOLERANCIA PERMITIDA PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Kg||' CONSUMO: '||New.Quantidade_Conferencia||' TOLERANCIA: '||qTolerancia||' SOBRA: '||QUANTIDADE_SOBRA||' ID: ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                                End
                            End
                    End else
                if (tTolerancia = 'P') then --Tolerancia em Percentual
                    Begin
    
                        if (Char_Length(:UMAlternativo) > 0 and New.Quantidade_Conferencia_ML > 0 AND PRODUTO_INVENTARIO = '1') then
                            begin
                            if (((New.Quantidade_Conferencia_ML) > (New.Consumo_Ml + ((New.Consumo_Ml + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000)))) or
                                ((New.Quantidade_Conferencia_ML) < (New.Consumo_Ml - ((New.Consumo_Ml + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000))))) then
                                begin
                                Exception "..." 'QUANTIDADE INFORMADA FORA DO PERCENTUAL DE TOLERANCIA PERMITIDO PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Ml||' CONSUMO: '||New.Quantidade_Conferencia_Ml||' TOLERANCIA: '||pTolerancia||'% SOBRA: '||coalesce(new.quantidade_sobra,0)|| 'ID ' || NEW.ID ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                                End
                            end else
                            Begin
                            if (((New.quantidade_conferencia) > (New.Consumo_Kg + ((New.Consumo_Kg + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000)))) or
                                ((New.quantidade_conferencia) < (New.Consumo_Kg - ((New.Consumo_Kg + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000))))) then
                                begin
                                Exception "..." 'QUANTIDADE INFORMADA FORA DO PERCENTUAL DE TOLERANCIA PERMITIDO PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Kg||' CONSUMO: '||New.Quantidade_Conferencia||' TOLERANCIA: '||pTolerancia||'% SOBRA: '||coalesce(new.quantidade_sobra,0)|| 'ID ' || NEW.ID || ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                                End
                            End
                    End
             End
    
                if (tTolerancia = '') then
                    begin
            
                        -- Verifica tolerancia por familia
                        For
                        Select First 1 F.Tolerancia_Qtd, F.Tolerancia_Perc, F.Tolerancia_Tipo, F.UnidadeMedida_Alternativo
                          From TbFamilia F, TbProduto P Where F.Codigo = P.Familia_Codigo and P.Codigo = New.Produto_Id and F.Tolerancia_tipo in ('Q','P')
                          Into :qTolerancia, :pTolerancia, :tTolerancia, :UMAlternativo
                         Do
                         Begin
            
                            if (tTolerancia = 'Q') then --Tolerancia em Quantidade
                                Begin
                                if (Char_Length(:UMAlternativo) > 0 and New.Quantidade_Conferencia_ML > 0 AND PRODUTO_INVENTARIO = '1') then
                                    begin
                                    if ((New.Quantidade_Conferencia_ML > (New.Consumo_Ml + QUANTIDADE_SOBRA + :qTolerancia)) or (New.Quantidade_Conferencia_ML < (New.Consumo_Ml + QUANTIDADE_SOBRA - :qTolerancia))) then
                                        begin
                                        Exception "..." 'QUANTIDADE INFORMADA FORA DA TOLERANCIA DA FAMILIA PERMITIDA PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Ml||' CONSUMO: '||New.Quantidade_Conferencia_Ml||' TOLERANCIA: '||qTolerancia||'. ID:' || NEW.ID;
                                        End
                                    end else
                                    Begin
                                    if ((New.Quantidade_Conferencia > (New.Consumo_Kg + QUANTIDADE_SOBRA + :qTolerancia)) or (New.Quantidade_Conferencia < (New.Consumo_Kg + QUANTIDADE_SOBRA - :qTolerancia)))  then
                                        begin
                                        Exception "..." 'QUANTIDADE INFORMADA FORA DA TOLERANCIA DA FAMILIA PERMITIDA PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Kg||' CONSUMO: '||New.Quantidade_Conferencia||' TOLERANCIA: '||qTolerancia||'. ID:' || NEW.ID;
                                        End
                                    End
                                End else
                            if (tTolerancia = 'P') then --Tolerancia em Percentual
                                Begin
                                if (Char_Length(:UMAlternativo) > 0 and New.Quantidade_Conferencia_ML > 0 AND PRODUTO_INVENTARIO = '1') then
                                    begin
                                    if ((New.Quantidade_Conferencia_Ml > (New.Consumo_Ml + ((New.Consumo_Ml + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000)))) or
                                        (New.Quantidade_Conferencia_Ml < (New.Consumo_Ml - ((New.Consumo_Ml + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000))))) then
                                        begin
                                        Exception "..." 'QUANTIDADE INFORMADA FORA DO PERCENTUAL DE TOLERANCIA DA FAMILIA PERMITIDO PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Ml||' CONSUMO: '||New.Quantidade_Conferencia_Ml||' TOLERANCIA: '||pTolerancia||'%. ID:' || NEW.ID;
                                        End
                                    end else
                                    Begin
                                    if ((New.Quantidade_Conferencia > (New.Consumo_Kg + ((New.Consumo_Kg + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000)))) or
                                        (New.Quantidade_Conferencia < (New.Consumo_Kg - ((New.Consumo_Kg + QUANTIDADE_SOBRA) * (:pTolerancia/100.0000))))) then
                                        begin
                                        Exception "..." 'QUANTIDADE INFORMADA FORA DO PERCENTUAL DE TOLERANCIA DA FAMILIA PERMITIDO PARA O PRODUTO "' || PRODUTO_DESCRICAO || '"! PROJECAO: '||New.Consumo_Kg||' CONSUMO: '||New.Quantidade_Conferencia||' TOLERANCIA: '||pTolerancia||'%. ID:' || NEW.ID;
                                        End
                                    End
                                End
                         End
                    End
    
                    */
        End
    end
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02i for tbtaloes_avulsos
active before insert or update position 1
AS
declare variable nova_remessa integer;
declare variable ANO integer;
declare variable MES integer;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID varchar(10);
declare variable ABREVGP varchar(10);
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable TALAO_ID integer;
declare variable quantidade_producao numeric(15,4);
declare variable quantidade_alternativa numeric(15,4);
declare variable espessura numeric(15,4);
declare variable densidade numeric(15,4);
declare variable produto_id integer;
declare variable um varchar(10);
declare variable uma varchar(10);
declare variable fator numeric(15,4);
declare variable linha_codigo integer;
declare variable densidade_espessura integer;
declare variable ITEM_PROCESSADO integer;
declare variable localizacao_id integer;
declare variable perfil_sku varchar(10);
declare variable programacao_id integer;
declare variable TEMPO_TOTAL numeric(18,8);
declare variable TEMPO_SETUP numeric(18,8);
declare variable autorizaCAO varchar(300);
declare variable gerar_taloes integer;
declare variable USUARIO_NOTIFICAR integer;
declare variable corpo1 blob sub_type 1 segment size 80;
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    ESTABELECIMENTO_CODIGO = 1;

    select
        g.familia_id,
        p.id as PERFIL,
        FN_REPLACE(substring(g.descricao from 1 for 3),'.|-|1|2|3|4|5|6|7||9|0','') as ABREVGP
    from TBGP_UP s, tbgp g, tbup u, tbperfil p, tbfamilia f
    where g.id = new.gp_id
        and g.id = s.gp_id
        and s.up_id = u.id
        and u.perfil = p.id
        and p.tabela = 'UP'
        and u.id = new.up_id
        and f.codigo = g.familia_id
    into FAMILIA_ID, PERFIL_UP, ABREVGP;

    gerar_taloes = 0;

    IF(inserting)THEN
    BEGIN

        autorizaCAO = trim(fn_parametro('TBFAMILIA.AUTORIZAR_AVULSOS', :FAMILIA_ID));

        IF(autorizaCAO = '0')THEN
        BEGIN
          NEW.autorizacao = 1;
          gerar_taloes = 1;
        end ELSE
        BEGIN
          NEW.autorizacao = 0;
          gerar_taloes = 0;

          for
            select OSPLIT FROM split(:autorizaCAO, ',')
          INTO
            :USUARIO_NOTIFICAR
          DO BEGIN

            corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
            corpo1 = corpo1 || '<p></p>';
            corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
            corpo1 = corpo1 || '<p><u>Usuário</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
            corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
            corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
            corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '</body></html>';

            execute procedure SPI_NOTIFICAR(current_timestamp, :USUARIO_NOTIFICAR, 'Talão Avulso Pendente de autorização', :corpo1,1,1);

          END
        END

    END

    IF(updating)THEN
    BEGIN

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
        corpo1 = corpo1 || '<p><u>Usuário</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
        corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

      IF(OLD.autorizacao = 0 AND NEW.autorizacao = 1)THEN
      BEGIN
        HISTORICO = 'Aprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Talão Avulso Aprovado', :corpo1,1,1);

        gerar_taloes = 1;
      END ELSE
      BEGIN
        gerar_taloes = 0;
      END

      IF(OLD.autorizacao <> 2 AND NEW.autorizacao = 2)THEN
      BEGIN
        HISTORICO = 'Reprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);
        gerar_taloes = 0;

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Talão Avulso Reprovado', :corpo1,1,1);

      END

    END

    IF(gerar_taloes = 1)THEN
    BEGIN
        ABREVGP = fn_lpad(new.up_id, 4, '0');
    
        ANO = extract(year from current_timestamp);
        MES = extract(month from current_timestamp);
    
        nova_remessa =  coalesce((select first 1 s.remessa_id from TBTALOES_AVULSOS_REMESSAS s, tbremessa r where r.numero = s.remessa_id and s.ANO = :ANO and s.MES = :MES and s.gp_id = new.gp_id and s.up_id = new.up_id),0);
    
        if(nova_remessa = 0)then
        begin
            nova_remessa = GEN_ID(GTBREMESSA,1);
    
            INSERT INTO TBTALOES_AVULSOS_REMESSAS (REMESSA_ID, ANO, MES, GP_ID, PERFIL_UP, UP_ID) VALUES (:nova_remessa, :ANO, :MES, new.gp_id, :PERFIL_UP, new.up_id);
    
            --########################## - remessa - ###############################
            INSERT INTO TBREMESSA (
                NUMERO,
                ESTABELECIMENTO_CODIGO,
                FAMILIA_CODIGO,
                TURNO_CODIGO,
                DATA,
                USUARIO_CODIGO,
                TIPO,
                TONALIDADE,
                PROJECAO,
                OC,
                BLOQ,
                STATUS,
                REMESSA,
                AGRUPAMENTO_ID,
                FAMILIA_MP,
                REQUISICAO,
                DESCRICAO,
                DATA_BSC,
                DATAHORA,
                GP_ID,
                CONTROLE_TALAO,
                COMPONENTE,
                WEB,
                AMOSTRA,
                DATA_DISPONIBILIDADE,
                OBSERVACAO,
                EMPRESA_ID,
                DATA_PREVISAO,
                PERFIL,
                CLASSIFICACAO
            ) VALUES (
                :nova_remessa,
                :ESTABELECIMENTO_CODIGO,
                :FAMILIA_ID,
                NULL,
                '01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4),
                new.usuario_id,
                '1',
                '',
                '0',
                '0',
                '0',
                '1',
                :ABREVGP||'_'||lpad(:ano, 4)||lpad(:mes, 2),
                0,
                0,
                '0',
                NULL,
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                new.gp_id,
                '',
                '0',
                '1',
                '0',
                NULL,
                '',
                0,
                NULL,
                '1',
                ''
            );
        end
    
        if(nova_remessa = 0)then
        begin
          exception "..." 'Erro ao gerar remessa.';
        end
    
        new.talao_id = coalesce((select max(t.talao_id) from TBTALOES_AVULSOS t where t.remessa_id = :nova_remessa),0) + 1;
    
        new.remessa_id = :nova_remessa;
    
        -- ################################ - talao acumulado - ########################################
    
        select
            p.codigo,
            f.unidademedida_sigla2,
            f.unidademedida_alternativo2,
            m.linha_codigo,
            m.densidade,
            m.espessura,
            f.densidade_espessura
        from tbproduto p, tbfamilia f, tbmodelo m
            where p.modelo_codigo = new.modelo_id
            and p.cor_codigo = new.cor_id
            and f.codigo = p.familia_codigo
            and m.codigo = new.modelo_id
            and p.status = '1'
            and m.status = '1'
            and f.status = '1'
        into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura;
    
        produto_id = coalesce(produto_id,0);
    
        if(produto_id = 0)then
        begin
           exception "..." 'Produto não encontrado. Verifique se tem um produto ativo com esse modelo e cor.';
        end
    
        quantidade_producao    = new.quantidade;
        quantidade_alternativa = 0;
        fator                  = coalesce(fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', :linha_codigo),0);
    
    
        if(char_length(trim(uma)) > 0)then
        begin
    
            if(fator = 0)then
            begin
              exception "..." 'Família com unidade de medida alternativa, mais fator não foi encontrado na linha. Linha:'||:linha_codigo||', Parametro:604 da linha.';
            end
    
            quantidade_producao    = new.quantidade / fator;
            quantidade_alternativa = new.quantidade;
        end
    
        if(coalesce(densidade_espessura,0) = 0)then
        begin
            Select
                Cast(Substring(Dens_Esp from 1 for 5) as Integer) Densidade,
                Cast(Substring(Dens_Esp from 6 for 5) as Numeric(15,2)) Espessura
            From (
                Select First 1
                Coalesce((Select First 1 lPad(M.Densidade,5,'0')||lPad(M.Espessura,5,'0')
                From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000') Dens_Esp
                From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                Where MC.Modelo_Id = new.modelo_id
                and MC.Cor_Id = new.cor_id
                and MC.Produto_Id = P2.Codigo
                and P2.Familia_Codigo = F.Codigo
                and F.Densidade_Espessura = '1'
                and((new.tamanho = 1 and MC.T01 > 0) or
                (new.tamanho = 2 and MC.T02 > 0) or
                (new.tamanho = 3 and MC.T03 > 0) or
                (new.tamanho = 4 and MC.T04 > 0) or
                (new.tamanho = 5 and MC.T05 > 0) or
                (new.tamanho = 6 and MC.T06 > 0) or
                (new.tamanho = 7 and MC.T07 > 0) or
                (new.tamanho = 8 and MC.T08 > 0) or
                (new.tamanho = 9 and MC.T09 > 0) or
                (new.tamanho =10 and MC.T10 > 0) or
                (new.tamanho =11 and MC.T11 > 0) or
                (new.tamanho =12 and MC.T12 > 0) or
                (new.tamanho =13 and MC.T13 > 0) or
                (new.tamanho =14 and MC.T14 > 0) or
                (new.tamanho =15 and MC.T15 > 0) or
                (new.tamanho =16 and MC.T16 > 0) or
                (new.tamanho =17 and MC.T17 > 0) or
                (new.tamanho =18 and MC.T18 > 0) or
                (new.tamanho =19 and MC.T19 > 0) or
                (new.tamanho =20 and MC.T20 > 0))
            ) into densidade, espessura;
    
        end
    
        TALAO_ID = GEN_ID(GTBREMESSA_ITEM_PROCESSADO,1);
    
        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            REMESSA,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            MATRIZ_CODIGO,
            OPERADOR_CODIGO,
            PRODUTO_CODIGO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_PRODUCAO,
            HORA_LIBERACAO,
            TAMANHO,
            QUANTIDADE,
            CHAPAS,
            PLACAS,
            SOBRAS,
            CONSUMO_MEDIO,
            OBSERVACAO,
            SITUACAO,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            ESPESSURA,
            SOBRAS_,
            PLACAS_,
            DENSIDADE,
            TOLERANCIA,
            OPERADOR_LIBERACAO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PLANOMESTRE_ID,
            LIB,
            UP_ID,
            OPERADOR_PRODUCAO,
            LOCALIZACAO_ID,
            TURNO,
            REQUISICAO_ID,
            PERC_SOBRA,
            QUANTIDADE_SOBRA,
            APROVEITAMENTO,
            ESTOQUE_ID,
            SEQ,
            ID,
            DATAHORA,
            QUANTIDADE_ALTERNATIVA,
            VIA_ETIQUETA,
            OPERADOR_GP,
            PERCENTUAL_TALAO_EXTRA,
            TALAO_EXTRA,
            TALAO_VINCULO,
            FERRAMENTA_ID,
            REPROCESSAR,
            FLAG_DATA,
            PERFIL
        ) VALUES (
            new.remessa_id,
            new.talao_id,
            :ESTABELECIMENTO_CODIGO,
            0,
            new.modelo_id,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            1,
            0,
            0,
            coalesce(:espessura,0),
            NULL,
            NULL,
            coalesce(:densidade,0),
            NULL,
            0,
            new.gp_id,
            1,
            0,
            '1',
            new.up_id,
            NULL,
            0,
            '',
            0,
            0,
            0,
            0,
            0,
            '',
            :TALAO_ID,
            current_timestamp,
            :quantidade_alternativa,
            0,
            0,
            NULL,
            NULL,
            NULL,
            NULL,
            0,
            0,
            NULL
        );
    
        --############################### - talao detalhado - ########################################
    
        ITEM_PROCESSADO = GEN_ID(GERADOR1_ID,1);
    
        localizacao_id = coalesce((select first 1 f.localizacao_codigo from TBFAMILIA f where f.codigo = :familia_id),0);
    
        :perfil_sku    = coalesce((select first 1 k.perfil from vwsku k where k.modelo_id = new.modelo_id and k.cor_id = new.cor_id and k.tamanho = new.tamanho),'');
    
        if(:perfil_sku = '')then
        begin
            exception "..." 'Erro ao consultar perfil do produto '||:produto_id;
        end
    
        INSERT INTO TBPEDIDO_ITEM_PROCESSADO (
            PEDIDO_ITEM_CONTROLE,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            CLIENTE_CODIGO,
            PEDIDO,
            REMESSA,
            REMESSA_ACUMULADO_CONTROLE,
            TURNO_LIBERACAO,
            TURNO_PRODUCAO,
            ESTEIRA_LIBERACAO,
            ESTEIRA_PRODUCAO,
            SETOR_CODIGO,
            PRODUTO_CODIGO,
            EXPEDICAO_PRODUTO_CODIGO,
            DATA_PROCESSAMENTO,
            DATA_EXPEDICAO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_EXPEDICAO,
            HORA_LIBERACAO,
            HORA_PRODUCAO,
            LOTE,
            TAMANHO,
            QUANTIDADE_PEDIDO,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
            SITUACAO,
            OPERADOR_ID_PRODUCAO,
            OPERADOR,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            PROGRAMACAO_TURNO,
            COR_ID,
            VOLUME,
            PECA_CONJUNTO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            VIA_ETIQUETA,
            LIB,
            LOCALIZACAO_CODIGO,
            REG_ESTOQUE,
            STATUS_PRODUCAO,
            AGRUPAMENTO_ID,
            COLETA_ID,
            ESTOQUE_ID,
            DATAHORA,
            QUANTIDADE_PRODUCAO_TMP,
            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            QUANTIDADE_ALTERN_PRODUCAO_TMP,
            QUANTIDADE_SOBRA_TMP,
            QUANTIDADE_SOBRA,
            ESTOQUE_ID_BAIXA,
            QUANTIDADE_BAIXA,
            TURNO,
            ACRESCIMO,
            TALAO_DESMEMBRAMENTO,
            ESTOQUE_ID_S_TRANSF,
            ESTOQUE_ID_E_TRANSF,
            MOTIVO_BAIXA,
            TIPO_BAIXA,
            CCUSTO_BAIXA,
            OBSERVACAO,
            FERRAMENTA_ID,
            ENDERECAMENTO_ID,
            FLAG_DATA,
            MOTIVO_BAIXA_ID,
            PERFIL
        )VALUES (
            0,
            :ITEM_PROCESSADO,
            :estabelecimento_codigo,
            0,
            new.modelo_id,
            NULL,
            NULL,
            new.remessa_id,
            new.talao_id,
            NULL,
            1,
            NULL,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            :quantidade_producao,
            :quantidade_producao,
            1,
            NULL,
            NULL,
            0,
            0,
            0,
            new.cor_id,
            0,
            1,
            new.gp_id,
            1,
            0,
            '0',
            :localizacao_id,
            '0',
            '0',
            0,
            NULL,
            0,
            current_timestamp,
            iif(:familia_id = 12, :quantidade_producao ,0),
            :quantidade_alternativa,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            NULL,
            NULL,
            NULL,
            '',
            '',
            '',
            NULL,
            NULL,
            NULL,
            0,
            0,
            :perfil_sku
        );
    
        localizacao_id = coalesce((select LOCALIZACAO_ID from SPC_ESTOQUE_TRANSACAO_REGRA(5,new.gp_id, :perfil_up, :produto_id, 'E', :ITEM_PROCESSADO)),0);
    
        if(:localizacao_id = 0)then
        begin
            exception "..." 'Erro ao consultar localização. Produto: '||:produto_id||', GP: '||new.gp_id||', Tipo: "E", Perfil: '||:perfil_up||' Regra: 5';
        end
    
        update TBPEDIDO_ITEM_PROCESSADO t set t.localizacao_codigo = :localizacao_id where t.controle = :ITEM_PROCESSADO;
    
    
        --################### - programacao - ####################
    
            TEMPO_TOTAL = 0;
            TEMPO_SETUP = 0;
            DELETE FROM TMP22040;
    
    
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               new.up_id,
               new.modelo_id,
               new.cor_id,
               new.tamanho,
               iif(coalesce(:quantidade_alternativa,0) = 0, :quantidade_producao, :quantidade_alternativa)
            );
                         
            --TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

            SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
            into :TEMPO_TOTAL, :TEMPO_SETUP;
    
            TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
            TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);
    
            IF ( TEMPO_TOTAL = 0 ) THEN
            BEGIN
                TEMPO_TOTAL = 1;
            END
    
            EXECUTE PROCEDURE SPI_PROGRAMACAO2(
                :estabelecimento_codigo,
                'A',
                new.gp_id,
                new.up_id,
                1,
                :TALAO_ID,
                0,
                0,
                :quantidade_producao,
                :TEMPO_TOTAL,
                new.remessa_id,
                current_date,
                :TEMPO_SETUP
            );
    
            --########################### - consumo - ############################
            execute procedure SPI_REM_CONSUMO_INSUMO_TALAO(:estabelecimento_codigo, new.remessa_id, new.talao_id);
     END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbunidademedida_b0d_01 for tbunidademedida
active before delete position 0
AS
DECLARE VARIABLE p1 integer;
DECLARE VARIABLE p2 integer;
Begin

For Select
(Select First 1 A.Codigo From TbFamilia A Where A.UnidadeMedida_Sigla2 = OLD.SIGLA) ,
(Select First 1 A.Codigo From TbProduto A Where A.UnidadeMedida_Sigla2 = OLD.SIGLA)

FROM RDB$DATABASE
Into :p1 , :p2
Do
begin

  if (:P1 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE FAMÍLIAS. ID.'||:P1||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
  if (:P2 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE PRODUTOS. ID.'||:P2||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';

end

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbunidade_temp_b0d_01 for tbunidademedida_temp
active before delete position 0
AS
DECLARE VARIABLE p1 integer;
DECLARE VARIABLE p2 integer;
Begin

For Select
(Select First 1 A.Codigo From TbFamilia A Where A.UnidadeMedida_Sigla2 = OLD.SIGLA) ,
(Select First 1 A.Codigo From TbProduto A Where A.UnidadeMedida_Sigla2 = OLD.SIGLA)

FROM RDB$DATABASE
Into :p1 , :p2
Do
begin

  if (:P1 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE FAMÍLIAS. ID.'||:P1||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
  if (:P2 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE PRODUTOS. ID.'||:P2||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';

end

End
^

SET TERM ; ^

CREATE OR ALTER VIEW VWCONFERENCIA_PENDENTE(
    TIPO_ID,
    TIPO,
    DOCUMENTO,
    GRUPO,
    REMESSA_ITEM_CONTROLE,
    CONTROLE,
    PRODUTO_CODIGO,
    DESCRICAO,
    LOCALIZACAO_CODIGO,
    LOCALIZACAO,
    CONFERENCIA,
    QUANTIDADE,
    UM,
    QUANTIDADE_ALTERNATIVA,
    UM_ALTERNATIVA,
    TAMANHO,
    PECA_ID,
    DATAHORA_DESC,
    DATAHORA,
    FAMILIA_CODIGO)
AS
select
    TRIM(TIPO_ID) TIPO_ID,
    TIPO,
    DOCUMENTO,
    GRUPO,
    '' REMESSA_ITEM_CONTROLE,
    list(CONTROLE) as CONTROLE,
    PRODUTO_CODIGO,
    DESCRICAO,
    LOCALIZACAO_CODIGO,
    (select first 1 l.descricao from tblocalizacao l where l.codigo = a.LOCALIZACAO_CODIGO) as LOCALIZACAO,
    CONFERENCIA,
    sum(QUANTIDADE) as QUANTIDADE,
    UM,         
    sum(QUANTIDADE_ALTERNATIVA) as QUANTIDADE_ALTERNATIVA,
    UM_ALTERNATIVA,
    fn_tamanho_produto(a.PRODUTO_CODIGO,A.TAMANHO) as TAMANHO,
    PECA_ID,
    fn_timestamp_to_string(max(datahora)) as datahora_desc,
    max(datahora),
    familia_codigo
from
(
    SELECT
        '1' TIPO_ID,
        'KANBAN' TIPO,
        i.documento,
        'KB'||FN_LPAD(D.KANBAN_LOTE_ID,11,0) GRUPO,
        I.peca_id,
        i.remessa_item_controle,
        i.controle,
        I.PRODUTO_CODIGO,
        P.DESCRICAO,
        I.OPERADOR,
        O.NOME,
        I.DATAHORA,
        I.LOCALIZACAO_CODIGO,
        I.CONFERENCIA,
        I.ESTOQUE_TRANSACAO_REGRA_ID,
        I.QUANTIDADE,
        P.UNIDADEMEDIDA_SIGLA2 UM,
        NULL QUANTIDADE_ALTERNATIVA,
        NULL UM_ALTERNATIVA,
        IIF(I.T01 > 0,01,
        IIF(I.T02 > 0,02,
        IIF(I.T03 > 0,03,
        IIF(I.T04 > 0,04,
        IIF(I.T05 > 0,05,
        IIF(I.T06 > 0,06,
        IIF(I.T07 > 0,07,
        IIF(I.T08 > 0,08,
        IIF(I.T09 > 0,09,
        IIF(I.T10 > 0,10,
        IIF(I.T11 > 0,11,
        IIF(I.T12 > 0,12,
        IIF(I.T13 > 0,13,
        IIF(I.T14 > 0,14,
        IIF(I.T15 > 0,15,
        IIF(I.T16 > 0,16,
        IIF(I.T17 > 0,17,
        IIF(I.T18 > 0,18,
        IIF(I.T19 > 0,19,
        IIF(I.T20 > 0,20, 0)))))))))))))))))))) AS TAMANHO,
        p.familia_codigo
    
        FROM
            TBESTOQUE_TRANSACAO_ITEM I
            LEFT JOIN TBKANBAN_LOTE_DETALHE D ON D.ID = I.TABELA_ID
            LEFT JOIN TBKANBAN_LOTE L ON L.ID = D.KANBAN_LOTE_ID--,
            LEFT JOIN TBPRODUTO P ON P.CODIGO = I.PRODUTO_CODIGO
            LEFT JOIN TBUSUARIO O ON O.CODIGO = I.USUARIO_CODIGO
    
        WHERE I.TIPO       = 'E'
        and i.tabela       = 'TBKANBAN_LOTE_DETALHE'
        and i.tabela_nivel = 0
        and i.estoque_transacao_regra_id > 0   
        and i.conferencia = 1
        AND L.STATUS = '1'
    
        union
    
    SELECT
        '2' TIPO_ID,
        'CONF. PROD.' TIPO,
        i.documento,
        'RA'||FN_LPAD(T.ID ,11,0) GRUPO,
        '' as peca_id,
        i.remessa_item_controle,
        i.controle,
        I.PRODUTO_CODIGO,
        P.DESCRICAO,
        I.OPERADOR,
        O.NOME,
        I.DATAHORA,
        I.LOCALIZACAO_CODIGO,
        I.CONFERENCIA,
        I.ESTOQUE_TRANSACAO_REGRA_ID,
        I.QUANTIDADE,
        P.UNIDADEMEDIDA_SIGLA2 UM,
        D.QUANTIDADE_ALTERN_SALDO QUANTIDADE_ALTERNATIVA,
        F.UNIDADEMEDIDA_ALTERNATIVO2 UM_ALTERNATIVA,
        IIF(I.T01 > 0,01,
        IIF(I.T02 > 0,02,
        IIF(I.T03 > 0,03,
        IIF(I.T04 > 0,04,
        IIF(I.T05 > 0,05,
        IIF(I.T06 > 0,06,
        IIF(I.T07 > 0,07,
        IIF(I.T08 > 0,08,
        IIF(I.T09 > 0,09,
        IIF(I.T10 > 0,10,
        IIF(I.T11 > 0,11,
        IIF(I.T12 > 0,12,
        IIF(I.T13 > 0,13,
        IIF(I.T14 > 0,14,
        IIF(I.T15 > 0,15,
        IIF(I.T16 > 0,16,
        IIF(I.T17 > 0,17,
        IIF(I.T18 > 0,18,
        IIF(I.T19 > 0,19,
        IIF(I.T20 > 0,20, 0)))))))))))))))))))) AS TAMANHO,
        p.familia_codigo

    FROM TBESTOQUE_TRANSACAO_ITEM I
    LEFT JOIN VWREMESSA_TALAO_DETALHE D ON D.ID = I.TABELA_ID
    LEFT JOIN VWREMESSA_TALAO T ON T.REMESSA_ID = D.REMESSA_ID AND T.REMESSA_TALAO_ID = D.REMESSA_TALAO_ID
    LEFT JOIN TBPRODUTO P ON P.CODIGO = I.PRODUTO_CODIGO
    LEFT JOIN TBFAMILIA F ON F.CODIGO = P.FAMILIA_CODIGO,
         TBUSUARIO O
    WHERE I.TABELA = 'TBPEDIDO_ITEM_PROCESSADO'
     AND I.TABELA_NIVEL = 1
     AND I.ESTOQUE_TRANSACAO_REGRA_ID > 0
     AND I.TIPO = 'E'
     AND O.CODIGO = I.USUARIO_CODIGO
     and i.conferencia = 1
    
     union
    
     SELECT   
        '3' TIPO_ID,
        'ABAST. WIP' TIPO,
        i.documento,   
        I.peca_id GRUPO,
        I.peca_id,
        i.remessa_item_controle,
        i.controle,
        I.PRODUTO_CODIGO,
        P.DESCRICAO,
        I.OPERADOR,
        O.NOME,
        I.DATAHORA,
        I.LOCALIZACAO_CODIGO,
        I.CONFERENCIA,
        I.ESTOQUE_TRANSACAO_REGRA_ID,
        I.QUANTIDADE,
        P.UNIDADEMEDIDA_SIGLA2 UM,
        NULL QUANTIDADE_ALTERNATIVA,   
        NULL UM_ALTERNATIVA,
        IIF(I.T01 > 0,01,
        IIF(I.T02 > 0,02,
        IIF(I.T03 > 0,03,
        IIF(I.T04 > 0,04,
        IIF(I.T05 > 0,05,
        IIF(I.T06 > 0,06,
        IIF(I.T07 > 0,07,
        IIF(I.T08 > 0,08,
        IIF(I.T09 > 0,09,
        IIF(I.T10 > 0,10,
        IIF(I.T11 > 0,11,
        IIF(I.T12 > 0,12,
        IIF(I.T13 > 0,13,
        IIF(I.T14 > 0,14,
        IIF(I.T15 > 0,15,
        IIF(I.T16 > 0,16,
        IIF(I.T17 > 0,17,
        IIF(I.T18 > 0,18,
        IIF(I.T19 > 0,19,
        IIF(I.T20 > 0,20, 0)))))))))))))))))))) AS TAMANHO,
        p.familia_codigo
    
    FROM
        TBESTOQUE_TRANSACAO_ITEM I,
        TBPRODUTO P,
        TBUSUARIO O
    
    WHERE
        I.TABELA = 'TBREMESSA_CONSUMO'
    AND I.TABELA_NIVEL = 4
    AND I.TIPO = 'E'
    AND I.ESTOQUE_TRANSACAO_REGRA_ID > 0
    AND O.CODIGO = I.USUARIO_CODIGO
    AND P.CODIGO = I.PRODUTO_CODIGO
    and i.conferencia = 1
    
    union
    
    SELECT 
        '4' TIPO_ID,
        'TRANS. REM.' TIPO,
        i.documento,     
        'TR'||FN_LPAD(C.REMESSA_ID,11,0) GRUPO,
        I.peca_id,
        i.remessa_item_controle,
        i.controle,
        I.PRODUTO_CODIGO,
        P.DESCRICAO,
        I.OPERADOR,
        O.NOME,
        I.DATAHORA,
        I.LOCALIZACAO_CODIGO,
        I.CONFERENCIA,
        I.ESTOQUE_TRANSACAO_REGRA_ID,
        I.QUANTIDADE,
        P.UNIDADEMEDIDA_SIGLA2 UM,
        NULL QUANTIDADE_ALTERNATIVA,   
        NULL UM_ALTERNATIVA,
        IIF(I.T01 > 0,01,
        IIF(I.T02 > 0,02,
        IIF(I.T03 > 0,03,
        IIF(I.T04 > 0,04,
        IIF(I.T05 > 0,05,
        IIF(I.T06 > 0,06,
        IIF(I.T07 > 0,07,
        IIF(I.T08 > 0,08,
        IIF(I.T09 > 0,09,
        IIF(I.T10 > 0,10,
        IIF(I.T11 > 0,11,
        IIF(I.T12 > 0,12,
        IIF(I.T13 > 0,13,
        IIF(I.T14 > 0,14,
        IIF(I.T15 > 0,15,
        IIF(I.T16 > 0,16,
        IIF(I.T17 > 0,17,
        IIF(I.T18 > 0,18,
        IIF(I.T19 > 0,19,
        IIF(I.T20 > 0,20, 0)))))))))))))))))))) AS TAMANHO,
        p.familia_codigo
    
    FROM
        TBESTOQUE_TRANSACAO_ITEM I
        LEFT JOIN VWREMESSA_CONSUMO C ON C.ID = I.TABELA_ID,
        TBPRODUTO P,
        TBUSUARIO O
    
    WHERE
        I.TABELA = 'TBREMESSA_CONSUMO'
    AND I.TABELA_NIVEL = 0
    AND I.TIPO = 'E'
    AND O.CODIGO = I.USUARIO_CODIGO
    AND P.CODIGO = I.PRODUTO_CODIGO
    and i.conferencia = 1
) A

group by
    TIPO_ID,
    TIPO,
    DOCUMENTO,
    GRUPO,
    REMESSA_ITEM_CONTROLE,
    PRODUTO_CODIGO,
    DESCRICAO,
    LOCALIZACAO_CODIGO,
    CONFERENCIA,
    TAMANHO,
    PECA_ID,
    UM,
    UM_ALTERNATIVA,
    familia_codigo
;

CREATE OR ALTER VIEW VWCONSUMO_TALAO(
    CONSUMO_ID,
    REMESSA_ID,
    REMESSA_TALAO_ID,
    TALAO_ID,
    DENSIDADE,
    ESPESSURA,
    PRODUTO_ID,
    PRODUTO_DESCRICAO,
    GRADE_ID,
    TAMANHO,
    TAMANHO_DESCRICAO,
    QUANTIDADE,
    QUANTIDADE_SALDO,
    UM,
    QUANTIDADE_ALTERNATIVA,
    QUANTIDADE_ALTERNATIVA_SALDO,
    UM_ALTERNATIVA,
    QUANTIDADE_ALOCADA,
    QUANTIDADE_ALTERNATIVA_ALOCADA,
    UM_ALTERNATIVA_ALOCADA)
AS
SELECT
                X.CONSUMO_ID,
                X.REMESSA_ID,
                X.REMESSA_TALAO_ID,
                X.TALAO_ID,
                X.DENSIDADE,
                X.ESPESSURA,
                X.PRODUTO_ID,
                X.PRODUTO_DESCRICAO,
                X.GRADE_ID,
                X.TAMANHO,
                X.TAMANHO_DESCRICAO,
                X.QUANTIDADE,
                X.QUANTIDADE_SALDO,   
                X.UM,
                X.QUANTIDADE_ALTERNATIVA,
                X.QUANTIDADE_ALTERNATIVA_SALDO,
                X.UM_ALTERNATIVA,
                X.QUANTIDADE_ALOCADA,
                X.QUANTIDADE_ALTERNATIVA_ALOCADA,
                X.UM_ALTERNATIVA_ALOCADA    

            FROM
                (SELECT
                    C.ID CONSUMO_ID,
                    T.REMESSA_ID,
                    T.REMESSA_TALAO_ID,
                    T.ID TALAO_ID,
                    C.DENSIDADE,
                    C.ESPESSURA,
                    C.PRODUTO_ID,
                    P.DESCRICAO PRODUTO_DESCRICAO,
                    P.GRADE_CODIGO GRADE_ID,
                    C.TAMANHO,
                    (SELECT FIRST 1 * FROM SP_TAMANHO_GRADE(P.GRADE_CODIGO,C.TAMANHO))TAMANHO_DESCRICAO,
                    C.QUANTIDADE,
                    C.QUANTIDADE_SALDO,   
                    P.UNIDADEMEDIDA_SIGLA2 UM,
                    C.QUANTIDADE_ALTERNATIVA,
                    C.QUANTIDADE_ALTERNATIVA_SALDO,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO) UM_ALTERNATIVA,
                    (SELECT SUM(QUANTIDADE) FROM TBREMESSA_TALAO_VINCULO V WHERE V.CONSUMO_ID = C.ID)QUANTIDADE_ALOCADA,
                    (SELECT SUM(QUANTIDADE_ALTERNATIVA) FROM TBREMESSA_TALAO_VINCULO V WHERE V.CONSUMO_ID = C.ID)QUANTIDADE_ALTERNATIVA_ALOCADA,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = (SELECT FIRST 1 FAMILIA_CODIGO FROM TBPRODUTO WHERE CODIGO = (SELECT FIRST 1 PRODUTO_ID FROM TBREMESSA_TALAO_VINCULO V WHERE V.CONSUMO_ID = C.ID))) UM_ALTERNATIVA_ALOCADA


                FROM
                    VWREMESSA_CONSUMO C,
                    VWREMESSA_TALAO T,
                    TBPRODUTO P

                WHERE
                    C.REMESSA_ID       = T.REMESSA_ID
                AND C.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID
                AND P.CODIGO           = C.PRODUTO_ID
                )X

            /*
            WHERE
                1=1
            @CONSUMO_ID
            @REMESSA_ID
            @REMESSA_TALAO_ID
            TALAO_ID = 32081
            */

            ORDER BY PRODUTO_ID
;

CREATE OR ALTER VIEW VWMODELO_FICHA_CONSUMO(
    TIPO,
    TIPO_DESCRICAO_COMPLETA,
    TIPO_DESCRICAO,
    MODELO_ID,
    MODELO_DESCRICAO,
    GRADE_CODIGO,
    TAMANHO,
    TAMANHO_DESCRICAO,
    COR_ID,
    COR_DESCRICAO,
    FAMILIA_ID,
    UM,
    CONSUMO_NIVEL,
    CONSUMO_FAMILIA_ID,
    CONSUMO_FAMILIA_DESCRICAO,
    CONSUMO_PRODUTO_ID,
    CONSUMO_PRODUTO_DESCRICAO,
    CONSUMO_PRODUTO_STATUS,
    CONSUMO_COR_ID,
    CONSUMO_MODELO_ID,
    CONSUMO_TAMANHO,
    CONSUMO_TAMANHO_DESCRICAO,
    CONSUMO_QUANTIDADE,
    CONSUMO_FATOR_CALCULO,
    CONSUMO_FATOR_CALCULO_TIPO,
    CONSUMO_FATOR_DIVISOR,
    CONSUMO_FATOR_MULTIPLICADOR,
    CONSUMO_UM,
    CONSUMO_UM_ALTERNATIVA,
    CONSUMO_MATRIZ_ID,
    CONSUMO_DENSIDADE,
    CONSUMO_ESPESSURA,
    CONSUMO_LOCALIZACAO_ID,
    HABILITA_GERAR_CONSUMO,
    COR_PADRAO,
    TAM_PADRAO,
    PERFIL_MOD,
    PERFIL_DESCRICAO,
    LINHA_ID,
    LINHA_DESCRICAO)
AS
SELECT
    TIPO,
    TIPO_DESCRICAO_COMPLETA,
    TIPO_DESCRICAO,
    MODELO_ID,
    MODELO_DESCRICAO,
    GRADE_CODIGO,
    TAMANHO,
    TAMANHO_DESCRICAO,
    COR_ID,
    COR_DESCRICAO,
    FAMILIA_ID,
    UM,
    CONSUMO_NIVEL,
    CONSUMO_FAMILIA_ID,
    CONSUMO_FAMILIA_DESCRICAO,
    CONSUMO_PRODUTO_ID,
    CONSUMO_PRODUTO_DESCRICAO,
    STATUS,
    CONSUMO_MODELO_ID,
    CONSUMO_COR_ID,
    CONSUMO_TAMANHO,
    CONSUMO_TAMANHO_DESCRICAO,
    CONSUMO_QUANTIDADE,
    CONSUMO_FATOR_CALCULO,
    CONSUMO_FATOR_CALCULO_TIPO,
    CONSUMO_FATOR_DIVISOR,
    CONSUMO_FATOR_MULTIPLICADOR,
    CONSUMO_UM,
    CONSUMO_UM_ALTERNATIVA,
    MATRIZ_ID,
    DENSIDADE,
    ESPESSURA,
    CONSUMO_LOCALIZACAO_ID,
    HABILITA_GERAR_CONSUMO,
    IIF(COR_ID  = 0 or COR_ID = COR_PADRAO_ID,1,0) COR_PADRAO,
    IIF(TAMANHO = 0 or TAMANHO = TAMANHO_PADRAO_ID,1,0) TAM_PADRAO,
    PERFIL_MOD,
    PERFIL_DESCRICAO,
    LINHA_ID,
    LINHA_DESCRICAO
    FROM (
            SELECT
            TIPO,
            TIPO_DESCRICAO_COMPLETA,
            TIPO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            GRADE_CODIGO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            FAMILIA_ID,
            UM,
            CONSUMO_NIVEL,
            CONSUMO_FAMILIA_ID,
            CONSUMO_FAMILIA_DESCRICAO,
            CONSUMO_PRODUTO_ID,
            CONSUMO_PRODUTO_DESCRICAO,
            STATUS,
            CONSUMO_MODELO_ID,
            CONSUMO_COR_ID,
            CONSUMO_TAMANHO,
            CONSUMO_TAMANHO_DESCRICAO,
            CONSUMO_QUANTIDADE,
            CONSUMO_FATOR_CALCULO,
            CONSUMO_FATOR_CALCULO_TIPO,
            CONSUMO_FATOR_DIVISOR,
            CONSUMO_FATOR_MULTIPLICADOR,
            CONSUMO_UM,
            CONSUMO_UM_ALTERNATIVA,
            MATRIZ_ID,
            DENSIDADE,
            ESPESSURA,
            CONSUMO_LOCALIZACAO_ID,
            HABILITA_GERAR_CONSUMO,
            COALESCE((SELECT FIRST 1 MP.COR_ID  FROM TBMODELO_PADRAO MP WHERE MP.MODELO_ID = Z.MODELO_ID),0) COR_PADRAO_ID,
            COALESCE((SELECT FIRST 1 MP.TAMANHO FROM TBMODELO_PADRAO MP WHERE MP.MODELO_ID = Z.MODELO_ID),0) TAMANHO_PADRAO_ID,
            PERFIL_MOD,
            (SELECT FIRST 1 P.DESCRICAO FROM TBPERFIL P WHERE P.TABELA = 'MOD' AND P.ID = Z.PERFIL_MOD) PERFIL_DESCRICAO,
            LINHA_ID,
            (SELECT FIRST 1 L.DESCRICAO FROM TBMODELO_LINHA L WHERE L.CODIGO = Z.LINHA_ID) LINHA_DESCRICAO
            FROM (
            SELECT *
            FROM (
                SELECT                                                                      
                    '1' TIPO,
                    TRIM('FICHA TÉCNICA DE CONSUMO DO MODELO POR COR') TIPO_DESCRICAO_COMPLETA,
                    TRIM('FICHA POR COR') TIPO_DESCRICAO,
                    CC.MODELO_ID,
                    M.DESCRICAO MODELO_DESCRICAO,       
                    M.GRADE_CODIGO,
                    S.TAMANHO,
                    FN_TAMANHO_GRADE(M.GRADE_CODIGO,S.TAMANHO) TAMANHO_DESCRICAO,
                    CC.COR_ID,
                    C.DESCRICAO COR_DESCRICAO,      
                    M.FAMILIA_INVENTARIO FAMILIA_ID,
                    M.UNIDADEMEDIDA_SIGLA2 UM,
                    CC.NIVEL CONSUMO_NIVEL,
                    F.CODIGO CONSUMO_FAMILIA_ID,
                    F.DESCRICAO CONSUMO_FAMILIA_DESCRICAO,
                    CC.PRODUTO_ID CONSUMO_PRODUTO_ID,
                    P.DESCRICAO CONSUMO_PRODUTO_DESCRICAO,
                    P.STATUS,
                    P.MODELO_CODIGO CONSUMO_MODELO_ID,
                    P.COR_CODIGO CONSUMO_COR_ID,
                    CC.TAM CONSUMO_TAMANHO,
                    FN_TAMANHO_GRADE(P.GRADE_CODIGO,CC.TAM) CONSUMO_TAMANHO_DESCRICAO,
            
                    IIF(COALESCE(M.GRADE_CODIGO,0) = 0 AND S.TAMANHO = 0,CC.QUANTIDADE,
                     CASE S.TAMANHO
                     WHEN 01 THEN CC.T01
                     WHEN 02 THEN CC.T02
                     WHEN 03 THEN CC.T03
                     WHEN 04 THEN CC.T04
                     WHEN 05 THEN CC.T05
                     WHEN 06 THEN CC.T06
                     WHEN 07 THEN CC.T07
                     WHEN 08 THEN CC.T08
                     WHEN 09 THEN CC.T09
                     WHEN 10 THEN CC.T10
                     WHEN 11 THEN CC.T11
                     WHEN 12 THEN CC.T12
                     WHEN 13 THEN CC.T13
                     WHEN 14 THEN CC.T14
                     WHEN 15 THEN CC.T15
                     WHEN 16 THEN CC.T16
                     WHEN 17 THEN CC.T17
                     WHEN 18 THEN CC.T18
                     WHEN 19 THEN CC.T19
                     WHEN 20 THEN CC.T20
                     END) CONSUMO_QUANTIDADE,
                    NULL CONSUMO_FATOR_CALCULO,
                    NULL CONSUMO_FATOR_CALCULO_TIPO,
                    CC.FATOR_CONVERSAO CONSUMO_FATOR_DIVISOR,
                    CC.FATOR_MATRIZ CONSUMO_FATOR_MULTIPLICADOR,
                    P.UNIDADEMEDIDA_SIGLA2 CONSUMO_UM,
                    F.UNIDADEMEDIDA_ALTERNATIVO2 CONSUMO_UM_ALTERNATIVA,
                    CC.MATRIZ_ID,
                    (SELECT FIRST 1 Z.DENSIDADE FROM TBMODELO Z WHERE Z.CODIGO = P.MODELO_CODIGO) DENSIDADE,
                    (SELECT FIRST 1 Z.ESPESSURA FROM TBMODELO Z WHERE Z.CODIGO = P.MODELO_CODIGO) ESPESSURA,
                    P.LOCALIZACAO_CODIGO CONSUMO_LOCALIZACAO_ID,
                    CC.HABILITA_GERAR_CONSUMO,
                    M.CLASSIFICACAO AS PERFIL_MOD,
                    M.LINHA_CODIGO AS LINHA_ID

                FROM
                    TBMODELO_CONSUMO_COR CC,
                    TBFAMILIA F,
                    TBMODELO M,
                    TBCOR C,
                    TBPRODUTO P,
                    TBGRADE_SEQ S
                
                WHERE TRUE
                AND M.CODIGO = CC.MODELO_ID
                AND C.CODIGO = CC.COR_ID
                AND P.CODIGO = CC.PRODUTO_ID
                AND F.CODIGO = P.FAMILIA_INVENTARIO
            
            ) X
            WHERE CONSUMO_QUANTIDADE > 0
            
            UNION
            
            SELECT *
            FROM (
                SELECT                                                             
                    '2' TIPO,
                    TRIM('FICHA TÉCNICA DE CONSUMO DO MODELO') TIPO_DESCRICAO_COMPLETA,
                    TRIM('FICHA GERAL') TIPO_DESCRICAO,
                    CC.MODELO_CODIGO,
                    M.DESCRICAO MODELO_DESCRICAO,       
                    M.GRADE_CODIGO,
                    S.TAMANHO,
                    FN_TAMANHO_GRADE(M.GRADE_CODIGO,S.TAMANHO) TAMANHO_DESCRICAO,
                    0 COR_ID,
                    ' TODAS AS CORES' COR_DESCRICAO,
                    M.FAMILIA_INVENTARIO FAMILIA_ID,
                    M.UNIDADEMEDIDA_SIGLA2 UM,
                    CC.NIVEL CONSUMO_NIVEL,
                    F.CODIGO CONSUMO_FAMILIA_ID,
                    F.DESCRICAO CONSUMO_FAMILIA_DESCRICAO,
                    CC.CONSUMO_PRODUTO_CODIGO CONSUMO_PRODUTO_ID,
                    P.DESCRICAO CONSUMO_PRODUTO_DESCRICAO,   
                    P.STATUS, 
                    P.MODELO_CODIGO CONSUMO_MODELO_ID,
                    P.COR_CODIGO CONSUMO_COR_ID,
                    CC.TAM CONSUMO_TAMANHO,
                    FN_TAMANHO_GRADE(P.GRADE_CODIGO,CC.TAM) CONSUMO_TAMANHO_DESCRICAO,
            
                    IIF(COALESCE(M.GRADE_CODIGO,0) = 0 AND S.TAMANHO = 0,CC.CONSUMO_QUANTIDADE,
                     CASE S.TAMANHO
                     WHEN 01 THEN CC.CONSUMO_QUANTIDADE_T01
                     WHEN 02 THEN CC.CONSUMO_QUANTIDADE_T02
                     WHEN 03 THEN CC.CONSUMO_QUANTIDADE_T03
                     WHEN 04 THEN CC.CONSUMO_QUANTIDADE_T04
                     WHEN 05 THEN CC.CONSUMO_QUANTIDADE_T05
                     WHEN 06 THEN CC.CONSUMO_QUANTIDADE_T06
                     WHEN 07 THEN CC.CONSUMO_QUANTIDADE_T07
                     WHEN 08 THEN CC.CONSUMO_QUANTIDADE_T08
                     WHEN 09 THEN CC.CONSUMO_QUANTIDADE_T09
                     WHEN 10 THEN CC.CONSUMO_QUANTIDADE_T10
                     WHEN 11 THEN CC.CONSUMO_QUANTIDADE_T11
                     WHEN 12 THEN CC.CONSUMO_QUANTIDADE_T12
                     WHEN 13 THEN CC.CONSUMO_QUANTIDADE_T13
                     WHEN 14 THEN CC.CONSUMO_QUANTIDADE_T14
                     WHEN 15 THEN CC.CONSUMO_QUANTIDADE_T15
                     WHEN 16 THEN CC.CONSUMO_QUANTIDADE_T16
                     WHEN 17 THEN CC.CONSUMO_QUANTIDADE_T17
                     WHEN 18 THEN CC.CONSUMO_QUANTIDADE_T18
                     WHEN 19 THEN CC.CONSUMO_QUANTIDADE_T19
                     WHEN 20 THEN CC.CONSUMO_QUANTIDADE_T20
                     END) CONSUMO_QUANTIDADE,
            
                    IIF(COALESCE(M.GRADE_CODIGO,0) = 0 AND S.TAMANHO = 0,CC.TAMANHO,
                     CASE S.TAMANHO
                     WHEN 01 THEN CC.TAM01
                     WHEN 02 THEN CC.TAM02
                     WHEN 03 THEN CC.TAM03
                     WHEN 04 THEN CC.TAM04
                     WHEN 05 THEN CC.TAM05
                     WHEN 06 THEN CC.TAM06
                     WHEN 07 THEN CC.TAM07
                     WHEN 08 THEN CC.TAM08
                     WHEN 09 THEN CC.TAM09
                     WHEN 10 THEN CC.TAM10
                     WHEN 11 THEN CC.TAM11
                     WHEN 12 THEN CC.TAM12
                     WHEN 13 THEN CC.TAM13
                     WHEN 14 THEN CC.TAM14
                     WHEN 15 THEN CC.TAM15
                     WHEN 16 THEN CC.TAM16
                     WHEN 17 THEN CC.TAM17
                     WHEN 18 THEN CC.TAM18
                     WHEN 19 THEN CC.TAM19
                     WHEN 20 THEN CC.TAM20
                     END) CONSUMO_FATOR_CALCULO,
                    CC.TIPO_PESO_NF CONSUMO_FATOR_CALCULO_TIPO,
                    CC.FATOR_CONVERSAO CONSUMO_FATOR_DIVISOR,
                    1 CONSUMO_FATOR_MULTIPLICADOR,
                    P.UNIDADEMEDIDA_SIGLA2 CONSUMO_UM,
                    F.UNIDADEMEDIDA_ALTERNATIVO2 CONSUMO_UM_ALTERNATIVA,
                    CC.MATRIZ_ID MATRIZ_ID,
                    (SELECT FIRST 1 Z.DENSIDADE FROM TBMODELO Z WHERE Z.CODIGO = P.MODELO_CODIGO) DENSIDADE,
                    (SELECT FIRST 1 Z.ESPESSURA FROM TBMODELO Z WHERE Z.CODIGO = P.MODELO_CODIGO) ESPESSURA,  
                    P.LOCALIZACAO_CODIGO CONSUMO_LOCALIZACAO_ID,
                    CC.HABILITA_GERAR_CONSUMO,
                    M.CLASSIFICACAO AS PERFIL_MOD,
                    M.LINHA_CODIGO AS LINHA_ID

                FROM
                    TBMODELO_CONSUMO CC,
                    TBFAMILIA F,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBGRADE_SEQ S
                
                WHERE TRUE
                AND M.CODIGO = CC.MODELO_CODIGO
                AND P.CODIGO = CC.CONSUMO_PRODUTO_CODIGO
                AND F.CODIGO = P.FAMILIA_INVENTARIO
            
            ) X
            WHERE CONSUMO_QUANTIDADE > 0
         ) Z
    )
;

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PECA (
    CODIGO_BARRAS varchar(50))
returns (
    TIPO varchar(4),
    TABELA varchar(92),
    ID integer,
    FAMILIA_ID integer,
    FAMILIA_DESCRICAO varchar(80),
    LOCALIZACAO_ID integer,
    LOCALIZACAO_DESCRICAO varchar(200),
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(400),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(200),
    QUANTIDADE numeric(18,5),
    SALDO_FISICO numeric(18,5),
    SALDO_ALOCADO numeric(18,4),
    SALDO numeric(18,5),
    UM varchar(12),
    QUANTIDADE_ALTERNATIVO numeric(18,5),
    SALDO_FISICO_ALTERNATIVO numeric(18,8),
    SALDO_ALOCADO_ALTERNATIVO numeric(18,4),
    SALDO_ALTERNATIVO numeric(18,8),
    UM_ALTERNATIVO varchar(12),
    STATUS integer,
    STATUS_DESCRICAO varchar(84))
as

declare procedure SUB_SPC_LOCATE_PECA(CODIGO_BARRAS varchar(50)) returns(TIPO varchar(4), TABELA varchar(36), ID integer, LOCALIZACAO_ID integer, PRODUTO_ID integer, TAMANHO integer, QUANTIDADE numeric(18,4), SALDO_FISICO numeric(18,4), QUANTIDADE_ALTERNATIVO numeric(18,4), SALDO_FISICO_ALTERNATIVO numeric(18,8), ALOCADO_DADOS varchar(40), STATUS integer) as begin

/* PECA DE TALAO DETALHADO */
if (position('RD' in CODIGO_BARRAS) = 1) then --
begin --
ID = cast(replace(CODIGO_BARRAS, 'RD', '') as integer);

for
    select trim('D') TIPO, trim('VWREMESSA_TALAO_DETALHE') TABELA, D.ID, D.LOCALIZACAO_ID, D.PRODUTO_ID, D.TAMANHO,
           D.QUANTIDADE_PRODUCAO QUANTIDADE, D.QUANTIDADE_SALDO SALDO_FISICO,
           D.QUANTIDADE_ALTERN_PRODUCAO QUANTIDADE_ALTERNATIVO, D.QUANTIDADE_ALTERN_SALDO SALDO_FISICO_ALTERNATIVO,

           (select lpad(coalesce(sum(V.QUANTIDADE), 0), 20) || lpad(coalesce(sum(V.QUANTIDADE_ALTERNATIVA), 0), 20)
            from TBREMESSA_TALAO_VINCULO V
            where V.STATUS <> '1' and
                  V.TIPO = 'D' and
                  V.TABELA_ID = D.ID) ALOCADO_DADOS,

           iif(D.STATUS = 3, 1, 0) STATUS
    from VWREMESSA_TALAO_DETALHE D
    where D.ID = :ID
    into TIPO, TABELA, ID, LOCALIZACAO_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, SALDO_FISICO, QUANTIDADE_ALTERNATIVO,
         SALDO_FISICO_ALTERNATIVO, ALOCADO_DADOS, STATUS do suspend;
end --
else --
/* PECA DE TALAO DETALHADO */
if (position('P' in CODIGO_BARRAS) = 1) then --
begin --
ID = cast(replace(CODIGO_BARRAS, 'P', '') as integer);

for
    select trim('R') TIPO, trim('TBREVISAO') TABELA, R.ID, R.LOCALIZACAO_ENTRADA, R.PRODUTO_ID, R.TAMANHO,
           R.PESO_LIQUIDO QUANTIDADE, R.SALDO SALDO_FISICO, R.METRAGEM QUANTIDADE_ALTERNATIVO,
           R.METRAGEM_SALDO SALDO_FISICO_ALTERNATIVO,

           (select lpad(coalesce(sum(V.QUANTIDADE), 0), 20) || lpad(coalesce(sum(V.QUANTIDADE_ALTERNATIVA), 0), 20)
            from TBREMESSA_TALAO_VINCULO V
            where V.STATUS <> '1' and
                  V.TIPO = 'R' and
                  V.TABELA_ID = R.ID) ALOCADO_DADOS,

           iif(((R.RESULTADO = 'I' or R.RESULTADO = 'R' or AVULSO = '1') or (R.RESULTADO = 'P' and R.STATUS_OB = '2')), 1, 0) STATUS
    from TBREVISAO R
    where R.ID = :ID
    into TIPO, TABELA, ID, LOCALIZACAO_ID, PRODUTO_ID, TAMANHO, QUANTIDADE, SALDO_FISICO, QUANTIDADE_ALTERNATIVO,
         SALDO_FISICO_ALTERNATIVO, ALOCADO_DADOS, STATUS do suspend;
end --

end
begin
    
    FOR
        SELECT
            Y.TIPO,
            Y.TABELA,
            Y.ID,
            F.CODIGO FAMILIA_ID,
            F.DESCRICAO FAMILIA_DESCRICAO,
            L.CODIGO LOCALIZACAO_ID,
            L.DESCRICAO LOCALIZACAO_DESCRICAO,
            Y.PRODUTO_ID,
            P.DESCRICAO PRODUTO_DESCRICAO,
            Y.TAMANHO,     
            FN_TAMANHO_GRADE(P.GRADE_CODIGO,Y.TAMANHO) TAMANHO_DESCRICAO,
            Y.QUANTIDADE,
            Y.SALDO_FISICO,
            Y.SALDO_ALOCADO,
            Y.SALDO_FISICO - Y.SALDO_ALOCADO SALDO,
            P.UNIDADEMEDIDA_SIGLA2 UM,
            IIF(TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2) = '', NULL,Y.QUANTIDADE_ALTERNATIVO) QUANTIDADE_ALTERNATIVO,
            IIF(TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2) = '', NULL,Y.SALDO_FISICO_ALTERNATIVO) SALDO_FISICO_ALTERNATIVO,
            IIF(TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2) = '', NULL,Y.SALDO_ALOCADO_ALTERNATIVO) SALDO_ALOCADO_ALTERNATIVO,
            IIF(TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2) = '', NULL,Y.SALDO_FISICO_ALTERNATIVO - Y.SALDO_ALOCADO_ALTERNATIVO) SALDO_ALTERNATIVO,
            IIF(TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2) = '', NULL, TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2)) UM_ALTERNATIVO,
            Y.STATUS,
            Y.STATUS_DESCRICAO
        FROM (
            SELECT
                TIPO,
                TABELA,
                ID,
                LOCALIZACAO_ID,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                SALDO_FISICO,
                CAST(SUBSTRING(ALOCADO_DADOS FROM 01 FOR 20) AS NUMERIC(15,4)) SALDO_ALOCADO,
                QUANTIDADE_ALTERNATIVO,
                SALDO_FISICO_ALTERNATIVO,
                CAST(SUBSTRING(ALOCADO_DADOS FROM 21 FOR 40) AS NUMERIC(15,4)) SALDO_ALOCADO_ALTERNATIVO,
                STATUS,
                TRIM(CASE STATUS
                WHEN 0 THEN 'INDISPONIVEL PARA USO'
                WHEN 1 THEN 'DISPONIVEL PARA USO'
                ELSE 'INDEFINIDO' END) STATUS_DESCRICAO
            FROM (
                SELECT
                    *
                FROM
                    SUB_SPC_LOCATE_PECA(:CODIGO_BARRAS)) X
            ) Y,
            TBPRODUTO P,
            TBFAMILIA F,
            TBLOCALIZACAO L
        WHERE P.CODIGO = Y.PRODUTO_ID
          AND F.CODIGO = P.FAMILIA_CODIGO
          AND L.CODIGO = Y.LOCALIZACAO_ID

    INTO
        TIPO,
        TABELA,
        ID,
        FAMILIA_ID,
        FAMILIA_DESCRICAO,
        LOCALIZACAO_ID,
        LOCALIZACAO_DESCRICAO,
        PRODUTO_ID,
        PRODUTO_DESCRICAO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        QUANTIDADE,
        SALDO_FISICO,
        SALDO_ALOCADO,
        SALDO,
        UM,
        QUANTIDADE_ALTERNATIVO,
        SALDO_FISICO_ALTERNATIVO,
        SALDO_ALOCADO_ALTERNATIVO,
        SALDO_ALTERNATIVO,
        UM_ALTERNATIVO,
        STATUS,
        STATUS_DESCRICAO
    DO SUSPEND;


end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_CONSUMO_MATRIZ4 (
    REMESSA_1 integer,
    CONTROLE_1 integer,
    CONTROLE_2 integer,
    FAMILIA_MP integer)
returns (
    ESTABELECIMENTO_CODIGO integer,
    FAMILIA_CODIGO integer,
    REMESSA integer,
    CONTROLE integer,
    PRODUTO_ID integer,
    TAMANHO integer,
    LOCALIZACAO_CODIGO integer,
    ESPESSURA numeric(18,2),
    DENSIDADE smallint,
    COR_CODIGO integer,
    QUANTIDADE numeric(18,4),
    CONSUMO_KG numeric(18,4),
    FATOR_CONVERSAO numeric(18,4),
    CONSUMO_ML numeric(18,4),
    ID integer,
    PRODUTO_DESCRICAO varchar(100))
as
BEGIN
--PROCEDURE USADA EXCLUSIVAMENTE NA GERAÇÃO DE CONSUMO DE TECIDO DE REMESSAS DE BOJO--
FOR Select C.Estabelecimento_Codigo, C.Familia_Codigo, C.Remessa,  
       C.Controle, X.Produto_Id, X.TAM,
       Coalesce(X.Localizacao_Codigo,0) Localizacao_Codigo, C.Espessura,
       C.Densidade, X.Cor_Codigo, Cast(C.Quantidade+Coalesce(C.Quantidade_Sobra,0.0000) as Numeric(15,4)) Quantidade,

       Cast((C.Consumo_Medio*X.Fator_Matriz) / X.Fator_Conversao / (Coalesce((Select First 1 Cast(M.Fator_Conversao as Numeric(15,2)) from TbMatriz M Where M.Codigo = C.Matriz_Codigo),1)) as Numeric(15,4))Consumo_Kg,

       Cast(X.Fator_Conversao as Numeric(15,4)) Fator_Conversao,
       IIF(TRIM(X.UnidadeMedida_Alternativo2) = 'M',

       Cast((C.Consumo_Medio * X.Fator_Matriz / (Coalesce((Select First 1 Cast(M.Fator_Conversao as Numeric(15,2)) from TbMatriz M Where M.Codigo = C.Matriz_Codigo),1))) as Numeric(15,4)),0.0000) Consumo_ML,

      (Select First 1 R.ID From TbRemessa_Consumo R
        where R.ESTABELECIMENTO_ID = C.Estabelecimento_Codigo
          and R.FAMILIA_ID = C.FAMILIA_CODIGO and R.REMESSA = C.REMESSA
          and R.TALAO = C.Controle and R.PRODUTO_ID = X.PRODUTO_ID
          and R.TAMANHO = X.TAM
          AND R.REQUISICAO_ID = 0) ID, B.DESCRICAO

  From TbProduto B, TbRemessa_Item_Processado C, 

       (Select MC.Modelo_Id, MC.Cor_Id, MP.Cor_Codigo, MC.Tam, MP.Localizacao_Codigo,
               MC.Fator_Conversao, MC.Fator_Matriz, MC.Produto_Id, F.UnidadeMedida_Alternativo2,
               MC.T01,MC.T02,MC.T03,MC.T04,MC.T05,MC.T06,MC.T07,MC.T08,MC.T09,MC.T10,
               MC.T11,MC.T12,MC.T13,MC.T14,MC.T15,MC.T16,MC.T17,MC.T18,MC.T19,MC.T20
          From TbModelo_Consumo_Cor MC, TbProduto MP, TbFamilia F
         Where MC.Produto_Id = MP.Codigo
         --and MC.Alocacao = '1'
           and F.Codigo = MP.Familia_Codigo
           and MP.Familia_Codigo = :Familia_Mp) X

 Where C.Produto_Codigo = B.Codigo
 
   and B.Modelo_Codigo = X.Modelo_Id
   and B.Cor_Codigo = X.Cor_Id
   and C.Remessa = :REMESSA_1
   and C.Controle Between :Controle_1 and :Controle_2

   and((C.Tamanho = 1 and X.T01 > 0) or
       (C.Tamanho = 2 and X.T02 > 0) or
       (C.Tamanho = 3 and X.T03 > 0) or
       (C.Tamanho = 4 and X.T04 > 0) or
       (C.Tamanho = 5 and X.T05 > 0) or
       (C.Tamanho = 6 and X.T06 > 0) or
       (C.Tamanho = 7 and X.T07 > 0) or
       (C.Tamanho = 8 and X.T08 > 0) or
       (C.Tamanho = 9 and X.T09 > 0) or
       (C.Tamanho =10 and X.T10 > 0) or
       (C.Tamanho =11 and X.T11 > 0) or
       (C.Tamanho =12 and X.T12 > 0) or
       (C.Tamanho =13 and X.T13 > 0) or
       (C.Tamanho =14 and X.T14 > 0) or
       (C.Tamanho =15 and X.T15 > 0) or
       (C.Tamanho =16 and X.T16 > 0) or
       (C.Tamanho =17 and X.T17 > 0) or
       (C.Tamanho =18 and X.T18 > 0) or
       (C.Tamanho =19 and X.T19 > 0) or
       (C.Tamanho =20 and X.T20 > 0))

INTO
:ESTABELECIMENTO_CODIGO,:FAMILIA_CODIGO,:REMESSA,:CONTROLE,:PRODUTO_ID,
:TAMANHO, :LOCALIZACAO_CODIGO,:ESPESSURA,:DENSIDADE,:COR_CODIGO,:QUANTIDADE,
:CONSUMO_KG,:FATOR_CONVERSAO,:CONSUMO_ML, :ID, :PRODUTO_DESCRICAO
DO
Begin

if (:LOCALIZACAO_CODIGO = 0) then
     Exception "..." 'REGISTRO CANCELADO, MATERIA-PRIMA SEM LOCALIZACAO DE ESTOQUE DEFINIDA: '||'Prod.'||:PRODUTO_ID||'-'||:PRODUTO_DESCRICAO||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';

if (:ID > 0) then
    Begin

    update TBREMESSA_CONSUMO
    set LOCALIZACAO_ID = :LOCALIZACAO_CODIGO,
        DENSIDADE = :DENSIDADE, ESPESSURA = :ESPESSURA, COR_ID = :COR_CODIGO,
        FATOR_CONVERSAO = :FATOR_CONVERSAO, QUANTIDADE = :QUANTIDADE,
        CONSUMO_ML = :CONSUMO_ML, CONSUMO_KG = :CONSUMO_KG
    where ESTABELECIMENTO_ID = :ESTABELECIMENTO_CODIGO
      and FAMILIA_ID = :FAMILIA_CODIGO
      and REMESSA = :REMESSA
      and TALAO = :CONTROLE
      and ID = :ID
      and PRODUTO_ID = :PRODUTO_ID
      and TAMANHO = :TAMANHO
      and (CONSUMO_KG <> :CONSUMO_KG or LOCALIZACAO_ID <> :LOCALIZACAO_CODIGO)
      and CONFERENCIA = '0'
      AND REQUISICAO_ID = 0;

    End else
    Begin
    insert into TBREMESSA_CONSUMO (ESTABELECIMENTO_ID, FAMILIA_ID, REMESSA, TALAO,
                                   PRODUTO_ID, TAMANHO, LOCALIZACAO_ID, DENSIDADE,
                                   ESPESSURA, COR_ID, ESTEIRA_ID, SETOR_ID,
                                   FATOR_CONVERSAO, QUANTIDADE, CONSUMO_ML,
                                   CONSUMO_KG, CONFERENCIA)
    values (:ESTABELECIMENTO_CODIGO, :FAMILIA_CODIGO, :REMESSA, :CONTROLE,
            :PRODUTO_ID, :TAMANHO, :LOCALIZACAO_CODIGO, :DENSIDADE, :ESPESSURA,
            :COR_CODIGO, 0, 0, :FATOR_CONVERSAO, :QUANTIDADE,
            :CONSUMO_ML, :CONSUMO_KG, 0);
    End

End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_CONSUMO_MATRIZ5 (
    REMESSA_1 integer,
    CONTROLE_1 integer,
    CONTROLE_2 integer,
    FAMILIA_MP integer)
as
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable FAMILIA_CODIGO integer;
declare variable REMESSA integer;
declare variable CONTROLE integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable LOCALIZACAO_CODIGO integer;
declare variable ESPESSURA numeric(18,2);
declare variable DENSIDADE smallint;
declare variable COR_CODIGO integer;
declare variable QUANTIDADE numeric(18,4);
declare variable CONSUMO_KG numeric(18,4);
declare variable FATOR_CONVERSAO numeric(18,4);
declare variable CONSUMO_ML numeric(18,4);
declare variable ID integer;
declare variable PRODUTO_DESCRICAO varchar(100);
BEGIN
--PROCEDURE USADA EXCLUSIVAMENTE NA GERAÇÃO DE CONSUMO DE TECIDO DE REMESSAS DE BOJO--
FOR Select C.Estabelecimento_Codigo, C.Familia_Codigo, C.Remessa,  
       C.Controle, X.Produto_Id, X.TAM,
       Coalesce(X.Localizacao_Codigo,0) Localizacao_Codigo, C.Espessura,
       C.Densidade, X.Cor_Codigo, Cast(C.Quantidade+Coalesce(C.Quantidade_Sobra,0.0000) as Numeric(15,4)) Quantidade,

       Cast((C.Consumo_Medio*X.Fator_Matriz) / X.Fator_Conversao / (Coalesce((Select First 1 Cast(M.Fator_Conversao as Numeric(15,2)) from TbMatriz M Where M.Codigo = C.Matriz_Codigo),1)) as Numeric(15,4))Consumo_Kg,

       Cast(X.Fator_Conversao as Numeric(15,4)) Fator_Conversao,
       IIF(TRIM(X.UnidadeMedida_Alternativo2) = 'M',

       Cast((C.Consumo_Medio * X.Fator_Matriz / (Coalesce((Select First 1 Cast(M.Fator_Conversao as Numeric(15,2)) from TbMatriz M Where M.Codigo = C.Matriz_Codigo),1))) as Numeric(15,4)),0.0000) Consumo_ML,

      (Select First 1 R.ID From TbRemessa_Consumo R
        where R.ESTABELECIMENTO_ID = C.Estabelecimento_Codigo
          and R.FAMILIA_ID = C.FAMILIA_CODIGO and R.REMESSA = C.REMESSA
          and R.TALAO = C.Controle and R.PRODUTO_ID = X.PRODUTO_ID
          and R.TAMANHO = X.TAM
          AND R.REQUISICAO_ID = 0) ID, B.DESCRICAO

  From TbProduto B, TbRemessa_Item_Processado C, 

       (Select MC.Modelo_Id, MC.Cor_Id, MP.Cor_Codigo, MC.Tam, MP.Localizacao_Codigo,
               MC.Fator_Conversao, MC.Fator_Matriz, MC.Produto_Id, F.UnidadeMedida_Alternativo2,
               MC.T01,MC.T02,MC.T03,MC.T04,MC.T05,MC.T06,MC.T07,MC.T08,MC.T09,MC.T10,
               MC.T11,MC.T12,MC.T13,MC.T14,MC.T15,MC.T16,MC.T17,MC.T18,MC.T19,MC.T20
          From TbModelo_Consumo_Cor MC, TbProduto MP, TbFamilia F
         Where MC.Produto_Id = MP.Codigo
         --and MC.Alocacao = '1'
           and F.Codigo = MP.Familia_Codigo
           and MP.Familia_Codigo = :Familia_Mp) X

 Where C.Produto_Codigo = B.Codigo
 
   and B.Modelo_Codigo = X.Modelo_Id
   and B.Cor_Codigo = X.Cor_Id
   and C.Remessa = :REMESSA_1
   and C.Controle Between :Controle_1 and :Controle_2

   and((C.Tamanho = 1 and X.T01 > 0) or
       (C.Tamanho = 2 and X.T02 > 0) or
       (C.Tamanho = 3 and X.T03 > 0) or
       (C.Tamanho = 4 and X.T04 > 0) or
       (C.Tamanho = 5 and X.T05 > 0) or
       (C.Tamanho = 6 and X.T06 > 0) or
       (C.Tamanho = 7 and X.T07 > 0) or
       (C.Tamanho = 8 and X.T08 > 0) or
       (C.Tamanho = 9 and X.T09 > 0) or
       (C.Tamanho =10 and X.T10 > 0) or
       (C.Tamanho =11 and X.T11 > 0) or
       (C.Tamanho =12 and X.T12 > 0) or
       (C.Tamanho =13 and X.T13 > 0) or
       (C.Tamanho =14 and X.T14 > 0) or
       (C.Tamanho =15 and X.T15 > 0) or
       (C.Tamanho =16 and X.T16 > 0) or
       (C.Tamanho =17 and X.T17 > 0) or
       (C.Tamanho =18 and X.T18 > 0) or
       (C.Tamanho =19 and X.T19 > 0) or
       (C.Tamanho =20 and X.T20 > 0))

INTO
:ESTABELECIMENTO_CODIGO,:FAMILIA_CODIGO,:REMESSA,:CONTROLE,:PRODUTO_ID,
:TAMANHO, :LOCALIZACAO_CODIGO,:ESPESSURA,:DENSIDADE,:COR_CODIGO,:QUANTIDADE,
:CONSUMO_KG,:FATOR_CONVERSAO,:CONSUMO_ML, :ID, :PRODUTO_DESCRICAO
DO
Begin

if (:CONSUMO_KG > 0) then
    Begin
        
        if (:ID > 0) then
             BEGIN
            if (:LOCALIZACAO_CODIGO = 0) then
                 Exception "..." 'REGISTRO CANCELADO, MATERIA-PRIMA SEM LOCALIZACAO DE ESTOQUE DEFINIDA: '||'Prod.'||:PRODUTO_ID||'-'||:PRODUTO_DESCRICAO||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        
            update TBREMESSA_CONSUMO
            set LOCALIZACAO_ID = :LOCALIZACAO_CODIGO,
                DENSIDADE = :DENSIDADE, ESPESSURA = :ESPESSURA, COR_ID = :COR_CODIGO,
                FATOR_CONVERSAO = :FATOR_CONVERSAO, QUANTIDADE = :QUANTIDADE,
                CONSUMO_ML = :CONSUMO_ML, CONSUMO_KG = :CONSUMO_KG
            where ESTABELECIMENTO_ID = :ESTABELECIMENTO_CODIGO
              and FAMILIA_ID = :FAMILIA_CODIGO
              and REMESSA = :REMESSA
              and TALAO = :CONTROLE
              and ID = :ID
              and PRODUTO_ID = :PRODUTO_ID
              and TAMANHO = :TAMANHO
              and (CONSUMO_KG <> :CONSUMO_KG or LOCALIZACAO_ID <> :LOCALIZACAO_CODIGO)
              and CONFERENCIA = '0'
              AND REQUISICAO_ID = 0;
        
            End else
            Begin
            insert into TBREMESSA_CONSUMO (ESTABELECIMENTO_ID, FAMILIA_ID, REMESSA, TALAO,
                                           PRODUTO_ID, TAMANHO, LOCALIZACAO_ID, DENSIDADE,
                                           ESPESSURA, COR_ID, ESTEIRA_ID, SETOR_ID,
                                           FATOR_CONVERSAO, QUANTIDADE, CONSUMO_ML,
                                           CONSUMO_KG, CONFERENCIA)
            values (:ESTABELECIMENTO_CODIGO, :FAMILIA_CODIGO, :REMESSA, :CONTROLE,
                    :PRODUTO_ID, :TAMANHO, :LOCALIZACAO_CODIGO, :DENSIDADE, :ESPESSURA,
                    :COR_CODIGO, 0, 0, :FATOR_CONVERSAO, :QUANTIDADE,
                    :CONSUMO_ML, :CONSUMO_KG, 0);
            End
    END
End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_CONSUMO_MATRIZ6 (
    REMESSA_1 integer,
    CONTROLE_1 integer,
    CONTROLE_2 integer,
    FAMILIA_MP integer)
as
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable FAMILIA_CODIGO integer;
declare variable REMESSA integer;
declare variable CONTROLE integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable LOCALIZACAO_CODIGO integer;
declare variable ESPESSURA numeric(18,2);
declare variable DENSIDADE smallint;
declare variable COR_CODIGO integer;
declare variable QUANTIDADE numeric(18,4);
declare variable CONSUMO_KG numeric(18,4);
declare variable FATOR_CONVERSAO numeric(18,4);
declare variable CONSUMO_ML numeric(18,4);
declare variable ID integer;
declare variable PRODUTO_DESCRICAO varchar(100);
BEGIN
--PROCEDURE USADA EXCLUSIVAMENTE NA GERAÇÃO DE CONSUMO DE TECIDO DE REMESSAS DE BOJO--
FOR Select C.Estabelecimento_Codigo, C.Familia_Codigo, C.Remessa,  
       C.Controle, X.Produto_Id, X.TAM,
       Coalesce(X.Localizacao_Codigo,0) Localizacao_Codigo, C.Espessura,
       C.Densidade, X.Cor_Codigo, Cast(C.Quantidade+Coalesce(C.Quantidade_Sobra,0.0000) as Numeric(15,4)) Quantidade,

       Cast(
       Cast(Cast((C.Consumo_Medio*X.Fator_Matriz) as Numeric(18,8)) / X.Fator_Conversao as Numeric(18,8))
       /*/(Coalesce((Select First 1 Cast(M.Fator_Conversao as Numeric(15,2)) from TbMatriz M Where M.Codigo = C.Matriz_Codigo),1))*/ as Numeric(15,4))Consumo_Kg,

       Cast(X.Fator_Conversao as Numeric(15,4)) Fator_Conversao,
       IIF(TRIM(X.UnidadeMedida_Alternativo2) = 'M',

       Cast((C.Consumo_Medio * X.Fator_Matriz
       /*/(Coalesce((Select First 1 Cast(M.Fator_Conversao as Numeric(15,2)) from TbMatriz M Where M.Codigo = C.Matriz_Codigo),1))*/ ) as Numeric(15,4)),0.0000) Consumo_ML,

      (Select First 1 R.ID From TbRemessa_Consumo R
        where R.ESTABELECIMENTO_ID = C.Estabelecimento_Codigo
          and R.FAMILIA_ID = C.FAMILIA_CODIGO and R.REMESSA = C.REMESSA
          and R.TALAO = C.Controle and R.PRODUTO_ID = X.PRODUTO_ID
          and R.TAMANHO = X.TAM
          AND R.REQUISICAO_ID = 0) ID, B.DESCRICAO

  From TbProduto B, TbRemessa_Item_Processado C, 

       (Select MC.Modelo_Id, MC.Cor_Id, MP.Cor_Codigo, MC.Tam, MP.Localizacao_Codigo,
               MC.Fator_Conversao, MC.Fator_Matriz, MC.Produto_Id, F.UnidadeMedida_Alternativo2,
               MC.T01,MC.T02,MC.T03,MC.T04,MC.T05,MC.T06,MC.T07,MC.T08,MC.T09,MC.T10,
               MC.T11,MC.T12,MC.T13,MC.T14,MC.T15,MC.T16,MC.T17,MC.T18,MC.T19,MC.T20
          From TbModelo_Consumo_Cor MC, TbProduto MP, TbFamilia F
         Where MC.Produto_Id = MP.Codigo
         --and MC.Alocacao = '1'
           and F.Codigo = MP.Familia_Codigo
           and MP.Familia_Codigo = :Familia_Mp) X

 Where C.Produto_Codigo = B.Codigo
 
   and B.Modelo_Codigo = X.Modelo_Id
   and B.Cor_Codigo = X.Cor_Id
   and C.Remessa = :REMESSA_1
   and C.Controle Between :Controle_1 and :Controle_2

   and((C.Tamanho = 1 and X.T01 > 0) or
       (C.Tamanho = 2 and X.T02 > 0) or
       (C.Tamanho = 3 and X.T03 > 0) or
       (C.Tamanho = 4 and X.T04 > 0) or
       (C.Tamanho = 5 and X.T05 > 0) or
       (C.Tamanho = 6 and X.T06 > 0) or
       (C.Tamanho = 7 and X.T07 > 0) or
       (C.Tamanho = 8 and X.T08 > 0) or
       (C.Tamanho = 9 and X.T09 > 0) or
       (C.Tamanho =10 and X.T10 > 0) or
       (C.Tamanho =11 and X.T11 > 0) or
       (C.Tamanho =12 and X.T12 > 0) or
       (C.Tamanho =13 and X.T13 > 0) or
       (C.Tamanho =14 and X.T14 > 0) or
       (C.Tamanho =15 and X.T15 > 0) or
       (C.Tamanho =16 and X.T16 > 0) or
       (C.Tamanho =17 and X.T17 > 0) or
       (C.Tamanho =18 and X.T18 > 0) or
       (C.Tamanho =19 and X.T19 > 0) or
       (C.Tamanho =20 and X.T20 > 0))

INTO
:ESTABELECIMENTO_CODIGO,:FAMILIA_CODIGO,:REMESSA,:CONTROLE,:PRODUTO_ID,
:TAMANHO, :LOCALIZACAO_CODIGO,:ESPESSURA,:DENSIDADE,:COR_CODIGO,:QUANTIDADE,
:CONSUMO_KG,:FATOR_CONVERSAO,:CONSUMO_ML, :ID, :PRODUTO_DESCRICAO
DO
Begin

if (:CONSUMO_KG > 0) then
    Begin
        
        if (:ID > 0) then
             BEGIN
            if (:LOCALIZACAO_CODIGO = 0) then
                 Exception "..." 'REGISTRO CANCELADO, MATERIA-PRIMA SEM LOCALIZACAO DE ESTOQUE DEFINIDA: '||'Prod.'||:PRODUTO_ID||'-'||:PRODUTO_DESCRICAO||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        
            update TBREMESSA_CONSUMO
            set LOCALIZACAO_ID = :LOCALIZACAO_CODIGO,
                DENSIDADE = :DENSIDADE, ESPESSURA = :ESPESSURA, COR_ID = :COR_CODIGO,
                FATOR_CONVERSAO = :FATOR_CONVERSAO, QUANTIDADE = :QUANTIDADE,
                CONSUMO_ML = :CONSUMO_ML, CONSUMO_KG = :CONSUMO_KG
            where ESTABELECIMENTO_ID = :ESTABELECIMENTO_CODIGO
              and FAMILIA_ID = :FAMILIA_CODIGO
              and REMESSA = :REMESSA
              and TALAO = :CONTROLE
              and ID = :ID
              and PRODUTO_ID = :PRODUTO_ID
              and TAMANHO = :TAMANHO
              and (CONSUMO_KG <> :CONSUMO_KG or LOCALIZACAO_ID <> :LOCALIZACAO_CODIGO)
              and CONFERENCIA = '0'
              AND REQUISICAO_ID = 0;
        
            End else
            Begin
            insert into TBREMESSA_CONSUMO (ESTABELECIMENTO_ID, FAMILIA_ID, REMESSA, TALAO,
                                           PRODUTO_ID, TAMANHO, LOCALIZACAO_ID, DENSIDADE,
                                           ESPESSURA, COR_ID, ESTEIRA_ID, SETOR_ID,
                                           FATOR_CONVERSAO, QUANTIDADE, CONSUMO_ML,
                                           CONSUMO_KG, CONFERENCIA)
            values (:ESTABELECIMENTO_CODIGO, :FAMILIA_CODIGO, :REMESSA, :CONTROLE,
                    :PRODUTO_ID, :TAMANHO, :LOCALIZACAO_CODIGO, :DENSIDADE, :ESPESSURA,
                    :COR_CODIGO, 0, 0, :FATOR_CONVERSAO, :QUANTIDADE,
                    :CONSUMO_ML, :CONSUMO_KG, 0);
            End
    END
End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO3 (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer)
as
declare variable O_ESTABELECIMENTO_ID integer;
declare variable O_REMESSA_ID integer;
declare variable O_REMESSA_TALAO_ID integer;
declare variable O_CONTROLE integer;
declare variable O_LOCALIZACAO_ID integer;
declare variable O_PRODUTO_ID integer;
declare variable O_TAMANHO integer;
declare variable O_DENSIDADE numeric(15,2);
declare variable O_ESPESSURA numeric(15,2);
declare variable O_QUANTIDADE numeric(15,4);
declare variable O_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable TALAO_QUANTIDADE numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(3);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer;
declare variable OLD_DESTINO_FAMILIA_ID integer;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_VALORES varchar(500);
declare variable OLD_QUANTIDADE_ORIGINAL numeric(15,4);
declare variable OLD_QUANTIDADE numeric(15,4);
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_DIRETA integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable GP_ID integer;
declare variable UM varchar(10);
declare variable CONSUMO_PERMITE_FRACAO varchar(10);
BEGIN
    /**
     * Limpa os registros atuais para poder recalcular
     */
    DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID;

    CONTROLE1 = 0;
    CONTROLE2 = 1;

    /**
     * Inicio do loop que carrega todos os taloes detalhados da remessa que foi parametrizada
     */
    FOR
        SELECT
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            T.QUANTIDADE TALAO_QUANTIDADE,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :Estabelecimento_Id
        AND D.REMESSA_ID         = :REMESSA_ID
        AND T.REMESSA_TALAO_ID < 9000 /* Remove os taloes de sobra da remessa */

    INTO
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :TALAO_QUANTIDADE,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :GP_ID
    DO
    BEGIN
        /**
         * Variavel que vai verificar se sera gerada projecao de consumo direto do proprio talao (FAMILIA PROJECAO = FAMILIA TALAO)
         */
        PROJECAO_DIRETA = (SELECT FIRST 1 ACUMULA_PROJECAO
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_ID
                             AND A.FAMILIA_MODELO_ID = :FAMILIA_ID  
                             AND A.GP_ORIGEM         = :GP_ID
                             );

        /* Verifica se o item tem projecao de si mesmo (CACHARREL / EDC DIV. ESPUMAS) */
        IF (PROJECAO_DIRETA IS NOT NULL) THEN
        BEGIN

            /**
             * Codigo que ira referenciar pares de insumo
             */
            CONTROLE1            = COALESCE(CONTROLE1,0)+1;
            CONSUMO_QUANTIDADE1  = :QUANTIDADE;
            CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;

            /**
             * Verifica se ACUMULA PROJECAO
             */
            IF (PROJECAO_DIRETA = '1') THEN
            BEGIN

                OLD_VALORES =
                (SELECT FIRST 1
                       (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                        LPAD(COALESCE(QUANTIDADE            ,0),20)||
                        LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                FROM  VWREMESSA_CONSUMO
                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                  AND REMESSA_ID         = :REMESSA_ID
                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                  AND PRODUTO_ID         = :PRODUTO_ID
                  AND TAMANHO            = :TAMANHO
                );

                OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                    
--                QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
--                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
--                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;

--                QUANTIDADE           = TALAO_QUANTIDADE;
                --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;
    
                /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,  
                    :TALAO_QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    '0'
                ) MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    PRODUTO_ID,
                    TAMANHO
                );
            END
            ELSE
            BEGIN

                /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,      
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,  
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,    
                    :QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    '0'
                );
            END

        END
        ELSE
        BEGIN
    
            /**
             * Inicializa o loop que carrega e calcula a projecao de consumo do talao detalhado
             */
            FOR
                /* Consulta de Insumos Independente de Cor */
                SELECT
                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao,
                    1 FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                FROM
                    TBMODELO_CONSUMO B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_CODIGO          = :MODELO_ID
                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                AND B.MODELO_CODIGO          = M.CODIGO
                AND B.HABILITA_GERAR_CONSUMO = '1'
                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO              = '1' /* Carrega somente familias que geram consumo */
                
                UNION
                /* Consulta de Insumos por Cor */
                SELECT
                    B.PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Projecao,
                    B.FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                
                FROM
                    TBMODELO_CONSUMO_COR B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_ID      = :MODELO_ID
                AND B.COR_ID         = :COR_ID
                AND B.PRODUTO_ID     = P.CODIGO
                AND B.MODELO_ID      = M.CODIGO      
                AND B.HABILITA_GERAR_CONSUMO = '1'
                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO      = '1' /* Carrega somente familias que geram consumo */
            
            INTO
                :PROJECAO_PRODUTO_ID,
                :PROJECAO_TAMANHO,
                :PROJECAO_LOCALIZACAO_ID,
                :PROJECAO_QUANTIDADE,
                :FATOR_MULT,
                :FATOR_DIV,
                :DESTINO_FAMILIA_ID,
                :UM_ALTERNATIVA,
                :ACUMULA_PROJECAO
        
            DO
            BEGIN
    
                /**
                 * Codigo que ira referenciar pares de insumo
                 */
                IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                    (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                THEN
                BEGIN
                    CONTROLE2 = COALESCE(CONTROLE2,0)+1;
                END

                /**
                 * Inicio do loop que forma os pares de insumo caso FATOR_MULT for maior que 1
                 */
                INCREMENTO = 1;
                WHILE (INCREMENTO <= :FATOR_MULT) DO
                BEGIN

                    /**
                     * Verifica se houve alguma projecao gerada
                     */
                    IF (:PROJECAO_QUANTIDADE > 0) THEN
                    BEGIN
                        /* Calcula as projecaes de consumo */
                        CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                        CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);
    
                        IF (ACUMULA_PROJECAO = '1') THEN
                        BEGIN

                            OLD_VALORES =
                            (SELECT FIRST 1
                                   (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                                    LPAD(COALESCE(QUANTIDADE            ,0),20)||
                                    LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                            FROM  VWREMESSA_CONSUMO
                            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                              AND REMESSA_ID         = :REMESSA_ID
                              AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                              AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                              AND TAMANHO            = :PROJECAO_TAMANHO
                            );
    
                            OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                            OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                            OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                                
--                            QUANTIDADE           = TALAO_QUANTIDADE;
                            --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                            CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + OLD_QUANTIDADE;
                            CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + OLD_QUANTIDADE_ALTERNATIVA;

                            /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                            UPDATE OR INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                CONTROLE,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE_ORIGINAL,
                                QUANTIDADE_NECES,
                                QUANTIDADE_NECES_ALTERN,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA,
                                SALDO_BAIXAR,
                                COMPONENTE
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :CONTROLE2,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :TALAO_QUANTIDADE,
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                '0'
                            ) MATCHING (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                PRODUTO_ID,
                                TAMANHO
                            );
                        END
                        ELSE
                        BEGIN
                            /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                            INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                REMESSA_TALAO_DETALHE_ID,      
                                CONTROLE,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE_ORIGINAL,  
                                QUANTIDADE_NECES,
                                QUANTIDADE_NECES_ALTERN,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA,   
                                SALDO_BAIXAR,
                                COMPONENTE
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :REMESSA_TALAO_DETALHE_ID,  
                                :CONTROLE2,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :QUANTIDADE,     
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                '0'
                            );
                        END
                    END
    
                    INCREMENTO = INCREMENTO+1;
                END
        
                OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
                  
                O_ESTABELECIMENTO_ID            = :ESTABELECIMENTO_ID      ;
                O_REMESSA_ID                    = :REMESSA_ID              ;
                O_REMESSA_TALAO_ID              = :REMESSA_TALAO_ID        ;
                O_CONTROLE                      = :CONTROLE2               ;
                O_LOCALIZACAO_ID                = :PROJECAO_LOCALIZACAO_ID ;
                O_PRODUTO_ID                    = :PROJECAO_PRODUTO_ID     ;
                O_TAMANHO                       = :PROJECAO_TAMANHO        ;
                O_DENSIDADE                     = :DENSIDADE               ;
                O_ESPESSURA                     = :ESPESSURA               ;
                O_QUANTIDADE                    = :CONSUMO_QUANTIDADE2     ;
                O_QUANTIDADE_ALTERNATIVA        = :CONSUMO_ALTERNATIVO2    ;
               -- SUSPEND;
            END
        END
    END

--    FOR
--        SELECT
--            C.REMESSA_TALAO_ID,
--            C.PRODUTO_ID,
--            C.TAMANHO,
--            C.QUANTIDADE,
--            P.UNIDADEMEDIDA_SIGLA UM
--        FROM
--            VWREMESSA_CONSUMO C,
--            TBPRODUTO P
--
--        WHERE
--            P.CODIGO = C.PRODUTO_ID
--        AND C.REMESSA_ID = :REMESSA_ID
--    INTO
--        REMESSA_TALAO_ID,
--        PRODUTO_ID,
--        TAMANHO,
--        QUANTIDADE,
--        UM
--    DO
--    BEGIN
--
--       CONSUMO_PERMITE_FRACAO = COALESCE((
--            SELECT U.PODE_FRACIONAR
--              FROM TbUnidadeMedida U
--             WHERE U.SIGLA = :UM),'N');
--
--        IF (CONSUMO_PERMITE_FRACAO = 'N') THEN
--        BEGIN
--            IF (QUANTIDADE > TRUNC(QUANTIDADE)) THEN
--            BEGIN
--                EXCEPTION "..." 'O PRODUTO ' || PRODUTO_ID || ' DE CONSUMO DO TALAO ' || REMESSA_TALAO_ID || ' NAO PERMITE QUANTIDADE FRACIONADA. QUANT.'||QUANTIDADE||' '||UM;
--            END
--        END
--
--    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO4 (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    REMESSA_TALAO integer,
    NEW_QUANTIDADE numeric(10,5),
    NEW_QUANTIDADE_ALT numeric(10,5),
    DETALHE_ID integer)
returns (
    OUT_ID integer,
    OUT_ESTABELECIMENTO_ID integer,
    OUT_REMESSA_ID integer,
    OUT_REMESSA_TALAO_ID integer,
    OUT_CONTROLE integer,
    OUT_LOCALIZACAO_ID integer,
    OUT_PRODUTO_ID integer,
    OUT_TAMANHO integer,
    OUT_DENSIDADE integer,
    OUT_ESPESSURA numeric(15,4),
    OUT_QUANTIDADE numeric(15,4),
    OUT_QUANTIDADE_ALTERNATIVA numeric(15,4),
    OUT_REMESSA_TALAO_DETALHE_ID integer)
as
declare variable CONT integer;
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(3);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer = 0;
declare variable OLD_DESTINO_FAMILIA_ID integer = 0;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_QUANTIDADE numeric(15,4) = 0;
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4) = 0;
declare variable PROJECAO_DIRETA integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable TEMP_ID integer;
declare variable SOBRA numeric(15,4);
declare variable ALTERNATIVA integer;
declare variable CONTROLE integer;
declare variable GP_ID integer;
BEGIN

    cont = 0;

    FOR
        SELECT
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            D.quantidade_sobra_tmp

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.remessa_talao_id
        AND D.REMESSA_TALAO_ID   = :REMESSA_TALAO
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :Estabelecimento_Id
        AND D.REMESSA_ID         = :REMESSA_ID
        AND T.REMESSA_TALAO_ID < 9000 /* Remove os talões de sobra da remessa */

    INTO
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :SOBRA
    DO
    BEGIN

        alternativa = Coalesce((Select First 1 1 From tbfamilia f Where f.unidademedida_alternativo2 is not null and f.unidademedida_alternativo2 <> '' and f.codigo = :FAMILIA_ID),0);
     
        if( alternativa >  0)then
        begin
            QUANTIDADE_ALTERNATIVA = QUANTIDADE_ALTERNATIVA + SOBRA;
        end else
        begin
            QUANTIDADE = QUANTIDADE + SOBRA;

        end

        if(cast(DETALHE_ID as integer) <> cast(REMESSA_TALAO_DETALHE_ID as integer))then
        begin

            --EXCEPTION "..." ''||REMESSA_TALAO||'-'||Estabelecimento_Id||'-'||REMESSA_ID||'-'||DETALHE_ID||'-'||REMESSA_TALAO_DETALHE_ID||'-'||QUANTIDADE||'-'||QUANTIDADE_ALTERNATIVA||'';

        end else
        begin
           --EXCEPTION "..." ''||REMESSA_TALAO||'-'||Estabelecimento_Id||'-'||REMESSA_ID||'-'||DETALHE_ID||'-'||REMESSA_TALAO_DETALHE_ID||'-'||QUANTIDADE||'-'||QUANTIDADE_ALTERNATIVA||'';
            QUANTIDADE = new_quantidade;
            QUANTIDADE_ALTERNATIVA = new_quantidade_alt;
        end

        /**
         * Variável que vai verificar se sera¡ gerada projecao de consumo direto do proprio talão (FAMILIA PROJECAO = FAMILIA TALAO)
         */
        PROJECAO_DIRETA = (SELECT ACUMULA_PROJECAO
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_ID
                             AND A.FAMILIA_MODELO_ID = :FAMILIA_ID
                             AND A.GP_ORIGEM         = :GP_ID);

        /* Verifica se o item tem projeção de si mesmo (CACHARREL) */
        IF (PROJECAO_DIRETA IS NOT NULL) THEN
        BEGIN

            /**
            CONTROLE1 = coalesce(CONTROLE1,0)+1;

            CONSUMO_QUANTIDADE1  = QUANTIDADE;
            CONSUMO_ALTERNATIVO1 = QUANTIDADE_ALTERNATIVA;

            IF (PROJECAO_DIRETA = '1') THEN
            BEGIN
    
                OLD_QUANTIDADE =
                    (SELECT FIRST 1 QUANTIDADE
                    FROM  VWREMESSA_CONSUMO
                    WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                      AND REMESSA_ID         = :REMESSA_ID
                      AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                      AND PRODUTO_ID         = :PRODUTO_ID
                      AND TAMANHO            = :TAMANHO
                );
    
                OLD_QUANTIDADE_ALTERNATIVA = (
                    SELECT FIRST 1 QUANTIDADE_ALTERNATIVA
                    FROM  VWREMESSA_CONSUMO
                    WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                      AND REMESSA_ID         = :REMESSA_ID
                      AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                      AND PRODUTO_ID         = :PRODUTO_ID
                      AND TAMANHO            = :TAMANHO
                );
    
                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + COALESCE(OLD_QUANTIDADE,0);
                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + COALESCE(OLD_QUANTIDADE_ALTERNATIVA,0);
    
               UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA
                )

                VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1
                ) MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    PRODUTO_ID,
                    TAMANHO
                );

                OUT_ID                      = :cont;
                out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                out_REMESSA_ID              = :REMESSA_ID;
                out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                out_CONTROLE                = :CONTROLE1;
                out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                out_PRODUTO_ID              = :PRODUTO_ID;
                out_TAMANHO                 = :TAMANHO;
                out_DENSIDADE               = :DENSIDADE;
                out_ESPESSURA               = :ESPESSURA;
                out_QUANTIDADE              = :CONSUMO_QUANTIDADE1;
                out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO1;
                OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                suspend;


            END
            ELSE
            BEGIN

                UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1
                )

                MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA
                );

                OUT_ID                      = :cont;
                out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                out_REMESSA_ID              = :REMESSA_ID;
                out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                out_CONTROLE                = :CONTROLE1;
                out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                out_PRODUTO_ID              = :PRODUTO_ID;
                out_TAMANHO                 = :TAMANHO;
                out_DENSIDADE               = :DENSIDADE;
                out_ESPESSURA               = :ESPESSURA;
                out_QUANTIDADE              = :CONSUMO_QUANTIDADE1;
                out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO1;
                OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                suspend;


            END
            **/
        END
        ELSE
        BEGIN

            /**
             * Inicializa o loop que carrega e calcula a projeção de consumo do talão detalhado
             */
            FOR
                /* Consulta de Insumos Independente de Cor */
                SELECT
                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao,
                    1 FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                FROM
                    TBMODELO_CONSUMO B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_CODIGO          = :MODELO_ID
                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                AND B.MODELO_CODIGO          = M.CODIGO
                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO              = '1' /* Carrega somente familias que geram consumo */
                
                UNION
                /* Consulta de Insumos por Cor */
                SELECT
                    B.PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Projecao,
                    B.FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                
                FROM
                    TBMODELO_CONSUMO_COR B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_ID      = :MODELO_ID
                AND B.COR_ID         = :COR_ID
                AND B.PRODUTO_ID     = P.CODIGO
                AND B.MODELO_ID      = M.CODIGO
                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO      = '1' /* Carrega somente familias que geram consumo */
            
            INTO
                :PROJECAO_PRODUTO_ID,
                :PROJECAO_TAMANHO,
                :PROJECAO_LOCALIZACAO_ID,
                :PROJECAO_QUANTIDADE,
                :FATOR_MULT,
                :FATOR_DIV,
                :DESTINO_FAMILIA_ID,
                :UM_ALTERNATIVA,
                :ACUMULA_PROJECAO
        
            DO
            BEGIN

                /**
                 * Código que irá referenciar pares de insumo
                 */
                IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                    (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                THEN
                BEGIN
                    CONTROLE2 = coalesce(CONTROLE2,0)+1;
                END
    
                /**
                 * Incío do loop que forma os pares de insumo caso FATOR_MULT for maior que 1
                 */
                INCREMENTO = 1;
                WHILE (INCREMENTO <= :FATOR_MULT) DO
                BEGIN


                    /**
                     * Verifica se houve alguma projeção gerada
                     */
                    IF ( ( QUANTIDADE = 0 AND :PROJECAO_QUANTIDADE = 0) OR (:PROJECAO_QUANTIDADE > 0) )  THEN
                    BEGIN
                        /* Calcula as projeções de consumo */
                        CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                        CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);
    
                        IF (ACUMULA_PROJECAO = '1') THEN
                        BEGIN

                        if(cont > 1)then
                        begin

                            OLD_QUANTIDADE =
                                (SELECT FIRST 1 QUANTIDADE
                                FROM  VWREMESSA_CONSUMO
                                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                  AND REMESSA_ID         = :REMESSA_ID
                                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                  AND TAMANHO            = :PROJECAO_TAMANHO
                            );
    
                            OLD_QUANTIDADE_ALTERNATIVA = (
                                SELECT FIRST 1 QUANTIDADE_ALTERNATIVA
                                FROM  VWREMESSA_CONSUMO
                                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                  AND REMESSA_ID         = :REMESSA_ID
                                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                  AND TAMANHO            = :PROJECAO_TAMANHO
                            );

                       end else
                       begin
                           OLD_QUANTIDADE = 0;
                           OLD_QUANTIDADE_ALTERNATIVA = 0;
                           cont = 2;
                       end
    
                            CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + COALESCE(OLD_QUANTIDADE,0);
                            CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + COALESCE(OLD_QUANTIDADE_ALTERNATIVA,0);
    
                            /* Atualiza ou insere o consumo na tabela (PROJEÇÃO ACUMULADA) */
                            UPDATE OR INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2
                            ) MATCHING (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                PRODUTO_ID,
                                TAMANHO
                            );

                            OUT_ID                      = :cont;
                            out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                            out_REMESSA_ID              = :REMESSA_ID;
                            out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                            out_CONTROLE                = :CONTROLE1;
                            out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                            out_PRODUTO_ID              = :PRODUTO_ID;
                            out_TAMANHO                 = :TAMANHO;
                            out_DENSIDADE               = :DENSIDADE;
                            out_ESPESSURA               = :ESPESSURA;
                            out_QUANTIDADE              = :CONSUMO_QUANTIDADE2;
                            out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO2;
                            OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                            suspend;

                        END
                        ELSE
                        BEGIN

                            /* Insere o consumo na tabela (PROJEÇÃO NÃO ACUMULADA) */
                            UPDATE OR INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                REMESSA_TALAO_DETALHE_ID,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :REMESSA_TALAO_DETALHE_ID,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2
                            )

                            MATCHING (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA
                            );
                
                                OUT_ID                      = :cont;
                                out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                                out_REMESSA_ID              = :REMESSA_ID;
                                out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                                out_CONTROLE                = :CONTROLE1;
                                out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                                out_PRODUTO_ID              = :PRODUTO_ID;
                                out_TAMANHO                 = :TAMANHO;
                                out_DENSIDADE               = :DENSIDADE;
                                out_ESPESSURA               = :ESPESSURA;
                                out_QUANTIDADE              = :CONSUMO_QUANTIDADE2;
                                out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO2;
                                OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                                suspend;
                        END
                    END
    
                    INCREMENTO = INCREMENTO+1;
                END
        
                OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO5 (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    REMESSA_TALAO integer,
    NEW_QUANTIDADE numeric(10,5),
    NEW_QUANTIDADE_ALT numeric(10,5),
    DETALHE_ID integer)
returns (
    OUT_ID integer,
    OUT_ESTABELECIMENTO_ID integer,
    OUT_REMESSA_ID integer,
    OUT_REMESSA_TALAO_ID integer,
    OUT_CONTROLE integer,
    OUT_LOCALIZACAO_ID integer,
    OUT_PRODUTO_ID integer,
    OUT_TAMANHO integer,
    OUT_DENSIDADE integer,
    OUT_ESPESSURA numeric(15,4),
    OUT_QUANTIDADE numeric(15,4),
    OUT_QUANTIDADE_ALTERNATIVA numeric(15,4),
    OUT_REMESSA_TALAO_DETALHE_ID integer)
as
declare variable CONT integer;
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(3);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer = 0;
declare variable OLD_DESTINO_FAMILIA_ID integer = 0;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_QUANTIDADE numeric(15,4) = 0;
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4) = 0;
declare variable PROJECAO_DIRETA integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable TEMP_ID integer;
declare variable SOBRA numeric(15,4);
declare variable ALTERNATIVA integer;
declare variable CONTROLE integer;
declare variable GP_ID integer;
BEGIN

    cont = 0;

    FOR
        SELECT
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            D.quantidade_sobra_tmp

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.remessa_talao_id
        AND D.REMESSA_TALAO_ID   = :REMESSA_TALAO
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :Estabelecimento_Id
        AND D.REMESSA_ID         = :REMESSA_ID
        AND T.REMESSA_TALAO_ID < 9000 /* Remove os talões de sobra da remessa */
        AND D.STATUS < 6

    INTO
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :SOBRA
    DO
    BEGIN

        alternativa = Coalesce((Select First 1 1 From tbfamilia f Where f.unidademedida_alternativo2 is not null and f.unidademedida_alternativo2 <> '' and f.codigo = :FAMILIA_ID),0);
     
        if( alternativa >  0)then
        begin
            QUANTIDADE_ALTERNATIVA = QUANTIDADE_ALTERNATIVA + SOBRA;
        end else
        begin
            QUANTIDADE = QUANTIDADE + SOBRA;

        end

        if(cast(DETALHE_ID as integer) <> cast(REMESSA_TALAO_DETALHE_ID as integer))then
        begin

            --EXCEPTION "..." ''||REMESSA_TALAO||'-'||Estabelecimento_Id||'-'||REMESSA_ID||'-'||DETALHE_ID||'-'||REMESSA_TALAO_DETALHE_ID||'-'||QUANTIDADE||'-'||QUANTIDADE_ALTERNATIVA||'';

        end else
        begin
           --EXCEPTION "..." ''||REMESSA_TALAO||'-'||Estabelecimento_Id||'-'||REMESSA_ID||'-'||DETALHE_ID||'-'||REMESSA_TALAO_DETALHE_ID||'-'||QUANTIDADE||'-'||QUANTIDADE_ALTERNATIVA||'';
            QUANTIDADE = new_quantidade;
            QUANTIDADE_ALTERNATIVA = new_quantidade_alt;
        end

        /**
         * Variável que vai verificar se sera¡ gerada projecao de consumo direto do proprio talão (FAMILIA PROJECAO = FAMILIA TALAO)
         */
        PROJECAO_DIRETA = (SELECT ACUMULA_PROJECAO
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_ID
                             AND A.FAMILIA_MODELO_ID = :FAMILIA_ID
                             AND A.GP_ORIGEM         = :GP_ID);

        /* Verifica se o item tem projeção de si mesmo (CACHARREL) */
        IF (PROJECAO_DIRETA IS NOT NULL) THEN
        BEGIN

            /**
            CONTROLE1 = coalesce(CONTROLE1,0)+1;

            CONSUMO_QUANTIDADE1  = QUANTIDADE;
            CONSUMO_ALTERNATIVO1 = QUANTIDADE_ALTERNATIVA;

            IF (PROJECAO_DIRETA = '1') THEN
            BEGIN
    
                OLD_QUANTIDADE =
                    (SELECT FIRST 1 QUANTIDADE
                    FROM  VWREMESSA_CONSUMO
                    WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                      AND REMESSA_ID         = :REMESSA_ID
                      AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                      AND PRODUTO_ID         = :PRODUTO_ID
                      AND TAMANHO            = :TAMANHO
                );
    
                OLD_QUANTIDADE_ALTERNATIVA = (
                    SELECT FIRST 1 QUANTIDADE_ALTERNATIVA
                    FROM  VWREMESSA_CONSUMO
                    WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                      AND REMESSA_ID         = :REMESSA_ID
                      AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                      AND PRODUTO_ID         = :PRODUTO_ID
                      AND TAMANHO            = :TAMANHO
                );
    
                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + COALESCE(OLD_QUANTIDADE,0);
                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + COALESCE(OLD_QUANTIDADE_ALTERNATIVA,0);
    
               UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA
                )

                VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1
                ) MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    PRODUTO_ID,
                    TAMANHO
                );

                OUT_ID                      = :cont;
                out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                out_REMESSA_ID              = :REMESSA_ID;
                out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                out_CONTROLE                = :CONTROLE1;
                out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                out_PRODUTO_ID              = :PRODUTO_ID;
                out_TAMANHO                 = :TAMANHO;
                out_DENSIDADE               = :DENSIDADE;
                out_ESPESSURA               = :ESPESSURA;
                out_QUANTIDADE              = :CONSUMO_QUANTIDADE1;
                out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO1;
                OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                suspend;


            END
            ELSE
            BEGIN

                UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1
                )

                MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA
                );

                OUT_ID                      = :cont;
                out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                out_REMESSA_ID              = :REMESSA_ID;
                out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                out_CONTROLE                = :CONTROLE1;
                out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                out_PRODUTO_ID              = :PRODUTO_ID;
                out_TAMANHO                 = :TAMANHO;
                out_DENSIDADE               = :DENSIDADE;
                out_ESPESSURA               = :ESPESSURA;
                out_QUANTIDADE              = :CONSUMO_QUANTIDADE1;
                out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO1;
                OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                suspend;


            END
            **/
        END
        ELSE
        BEGIN

            /**
             * Inicializa o loop que carrega e calcula a projeção de consumo do talão detalhado
             */
            FOR
                /* Consulta de Insumos Independente de Cor */
                SELECT
                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao,
                    1 FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                FROM
                    TBMODELO_CONSUMO B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_CODIGO          = :MODELO_ID
                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                AND B.MODELO_CODIGO          = M.CODIGO
                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO              = '1' /* Carrega somente familias que geram consumo */
                
                UNION
                /* Consulta de Insumos por Cor */
                SELECT
                    B.PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Projecao,
                    B.FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                
                FROM
                    TBMODELO_CONSUMO_COR B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_ID      = :MODELO_ID
                AND B.COR_ID         = :COR_ID
                AND B.PRODUTO_ID     = P.CODIGO
                AND B.MODELO_ID      = M.CODIGO
                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO      = '1' /* Carrega somente familias que geram consumo */
            
            INTO
                :PROJECAO_PRODUTO_ID,
                :PROJECAO_TAMANHO,
                :PROJECAO_LOCALIZACAO_ID,
                :PROJECAO_QUANTIDADE,
                :FATOR_MULT,
                :FATOR_DIV,
                :DESTINO_FAMILIA_ID,
                :UM_ALTERNATIVA,
                :ACUMULA_PROJECAO
        
            DO
            BEGIN

                /**
                 * Código que irá referenciar pares de insumo
                 */
                IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                    (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                THEN
                BEGIN
                    CONTROLE2 = coalesce(CONTROLE2,0)+1;
                END
    
                /**
                 * Incío do loop que forma os pares de insumo caso FATOR_MULT for maior que 1
                 */
                INCREMENTO = 1;
                WHILE (INCREMENTO <= :FATOR_MULT) DO
                BEGIN


                    /**
                     * Verifica se houve alguma projeção gerada
                     */
                    IF ( ( QUANTIDADE = 0 AND :PROJECAO_QUANTIDADE = 0) OR (:PROJECAO_QUANTIDADE > 0) )  THEN
                    BEGIN
                        /* Calcula as projeções de consumo */
                        CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                        CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);
    
                        IF (ACUMULA_PROJECAO = '1') THEN
                        BEGIN

                        if(cont > 1)then
                        begin

                            OLD_QUANTIDADE =
                                (SELECT FIRST 1 QUANTIDADE
                                FROM  VWREMESSA_CONSUMO
                                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                  AND REMESSA_ID         = :REMESSA_ID
                                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                  AND TAMANHO            = :PROJECAO_TAMANHO
                            );
    
                            OLD_QUANTIDADE_ALTERNATIVA = (
                                SELECT FIRST 1 QUANTIDADE_ALTERNATIVA
                                FROM  VWREMESSA_CONSUMO
                                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                  AND REMESSA_ID         = :REMESSA_ID
                                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                  AND TAMANHO            = :PROJECAO_TAMANHO
                            );

                       end else
                       begin
                           OLD_QUANTIDADE = 0;
                           OLD_QUANTIDADE_ALTERNATIVA = 0;
                           cont = 2;
                       end
    
                            CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + COALESCE(OLD_QUANTIDADE,0);
                            CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + COALESCE(OLD_QUANTIDADE_ALTERNATIVA,0);
    
                            /* Atualiza ou insere o consumo na tabela (PROJEÇÃO ACUMULADA) */
                            UPDATE OR INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2
                            ) MATCHING (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                PRODUTO_ID,
                                TAMANHO
                            );

                            OUT_ID                      = :cont;
                            out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                            out_REMESSA_ID              = :REMESSA_ID;
                            out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                            out_CONTROLE                = :CONTROLE1;
                            out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                            out_PRODUTO_ID              = :PRODUTO_ID;
                            out_TAMANHO                 = :TAMANHO;
                            out_DENSIDADE               = :DENSIDADE;
                            out_ESPESSURA               = :ESPESSURA;
                            out_QUANTIDADE              = :CONSUMO_QUANTIDADE2;
                            out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO2;
                            OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                            suspend;

                        END
                        ELSE
                        BEGIN

                            /* Insere o consumo na tabela (PROJEÇÃO NÃO ACUMULADA) */
                            UPDATE OR INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                REMESSA_TALAO_DETALHE_ID,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :REMESSA_TALAO_DETALHE_ID,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2
                            )

                            MATCHING (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA
                            );
                
                                OUT_ID                      = :cont;
                                out_estabelecimento_id      = :ESTABELECIMENTO_ID;
                                out_REMESSA_ID              = :REMESSA_ID;
                                out_REMESSA_TALAO_ID        = :REMESSA_TALAO_ID;
                                out_CONTROLE                = :CONTROLE1;
                                out_LOCALIZACAO_ID          = :LOCALIZACAO_ID;
                                out_PRODUTO_ID              = :PRODUTO_ID;
                                out_TAMANHO                 = :TAMANHO;
                                out_DENSIDADE               = :DENSIDADE;
                                out_ESPESSURA               = :ESPESSURA;
                                out_QUANTIDADE              = :CONSUMO_QUANTIDADE2;
                                out_QUANTIDADE_ALTERNATIVA  = :CONSUMO_ALTERNATIVO2;
                                OUT_REMESSA_TALAO_DETALHE_ID= :REMESSA_TALAO_DETALHE_ID;
                                suspend;
                        END
                    END
    
                    INCREMENTO = INCREMENTO+1;
                END
        
                OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO7 (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    TALAO_INICIAL integer,
    TALAO_FINAL integer)
as
declare variable O_ESTABELECIMENTO_ID integer;
declare variable O_REMESSA_ID integer;
declare variable O_REMESSA_TALAO_ID integer;
declare variable O_CONTROLE integer;
declare variable O_LOCALIZACAO_ID integer;
declare variable O_PRODUTO_ID integer;
declare variable O_TAMANHO integer;
declare variable O_DENSIDADE numeric(15,2);
declare variable O_ESPESSURA numeric(15,2);
declare variable O_QUANTIDADE numeric(15,4);
declare variable O_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(3);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer;
declare variable OLD_DESTINO_FAMILIA_ID integer;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_VALORES varchar(500);
declare variable OLD_QUANTIDADE_ORIGINAL numeric(15,4);
declare variable OLD_QUANTIDADE numeric(15,4);
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_DIRETA integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable GP_ID integer;
BEGIN
    /**
     * Limpa os registros atuais para poder recalcular
     */
    DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID and a.REMESSA_TALAO_ID between :talao_inicial and :talao_final;

    CONTROLE1 = 0;
    CONTROLE2 = 1;

    /**
     * Inicio do loop que carrega todos os taloes detalhados da remessa que foi parametrizada
     */
    FOR
        SELECT
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :Estabelecimento_Id
        AND D.REMESSA_ID         = :REMESSA_ID
        and T.REMESSA_TALAO_ID between :talao_inicial and :talao_final
        AND T.REMESSA_TALAO_ID < 9000 /* Remove os taloes de sobra da remessa */

    INTO
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :GP_ID
    DO
    BEGIN
        /**
         * Variavel que vai verificar se sera gerada projecao de consumo direto do proprio talao (FAMILIA PROJECAO = FAMILIA TALAO)
         */
        PROJECAO_DIRETA = (SELECT FIRST 1 ACUMULA_PROJECAO
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_ID
                             AND A.FAMILIA_MODELO_ID = :FAMILIA_ID  
                             AND A.GP_ORIGEM         = :GP_ID
                             );

        /* Verifica se o item tem projecao de si mesmo (CACHARREL / EDC DIV. ESPUMAS) */
        IF (PROJECAO_DIRETA IS NOT NULL) THEN
        BEGIN

            /**
             * Codigo que ira referenciar pares de insumo
             */
            CONTROLE1            = COALESCE(CONTROLE1,0)+1;
            CONSUMO_QUANTIDADE1  = :QUANTIDADE;
            CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;

            /**
             * Verifica se ACUMULA PROJECAO
             */
            IF (PROJECAO_DIRETA = '1') THEN
            BEGIN

                OLD_VALORES =
                (SELECT FIRST 1
                       (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                        LPAD(COALESCE(QUANTIDADE            ,0),20)||
                        LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                FROM  VWREMESSA_CONSUMO
                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                  AND REMESSA_ID         = :REMESSA_ID
                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                  AND TAMANHO            = :PROJECAO_TAMANHO
                );

                OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                    
                QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;

    
                /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,  
                    :QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    '0'
                ) MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    PRODUTO_ID,
                    TAMANHO
                );
            END
            ELSE
            BEGIN

                /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,      
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,  
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,    
                    :QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    '0'
                );
            END

        END
        ELSE
        BEGIN
    
            /**
             * Inicializa o loop que carrega e calcula a projecao de consumo do talao detalhado
             */
            FOR
                /* Consulta de Insumos Independente de Cor */
                SELECT
                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao,
                    1 FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                FROM
                    TBMODELO_CONSUMO B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_CODIGO          = :MODELO_ID
                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                AND B.MODELO_CODIGO          = M.CODIGO
                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO              = '1' /* Carrega somente familias que geram consumo */
                
                UNION
                /* Consulta de Insumos por Cor */
                SELECT
                    B.PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Projecao,
                    B.FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                
                FROM
                    TBMODELO_CONSUMO_COR B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_ID      = :MODELO_ID
                AND B.COR_ID         = :COR_ID
                AND B.PRODUTO_ID     = P.CODIGO
                AND B.MODELO_ID      = M.CODIGO
                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO      = '1' /* Carrega somente familias que geram consumo */
            
            INTO
                :PROJECAO_PRODUTO_ID,
                :PROJECAO_TAMANHO,
                :PROJECAO_LOCALIZACAO_ID,
                :PROJECAO_QUANTIDADE,
                :FATOR_MULT,
                :FATOR_DIV,
                :DESTINO_FAMILIA_ID,
                :UM_ALTERNATIVA,
                :ACUMULA_PROJECAO
        
            DO
            BEGIN
    
                /**
                 * Codigo que ira referenciar pares de insumo
                 */
                IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                    (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                THEN
                BEGIN
                    CONTROLE2 = COALESCE(CONTROLE2,0)+1;
                END

                /**
                 * Inicio do loop que forma os pares de insumo caso FATOR_MULT for maior que 1
                 */
                INCREMENTO = 1;
                WHILE (INCREMENTO <= :FATOR_MULT) DO
                BEGIN

                    /**
                     * Verifica se houve alguma projecao gerada
                     */
                    IF (:PROJECAO_QUANTIDADE > 0) THEN
                    BEGIN
                        /* Calcula as projecaes de consumo */
                        CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                        CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);
    
                        IF (ACUMULA_PROJECAO = '1') THEN
                        BEGIN

                            OLD_VALORES =
                            (SELECT FIRST 1
                                   (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                                    LPAD(COALESCE(QUANTIDADE            ,0),20)||
                                    LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                            FROM  VWREMESSA_CONSUMO
                            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                              AND REMESSA_ID         = :REMESSA_ID
                              AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                              AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                              AND TAMANHO            = :PROJECAO_TAMANHO
                            );
    
                            OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                            OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                            OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                                
                            QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                            CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + OLD_QUANTIDADE;
                            CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + OLD_QUANTIDADE_ALTERNATIVA;

                            /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                            UPDATE OR INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                CONTROLE,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE_ORIGINAL,
                                QUANTIDADE_NECES,
                                QUANTIDADE_NECES_ALTERN,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA,
                                SALDO_BAIXAR,
                                COMPONENTE
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :CONTROLE2,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :QUANTIDADE,      
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                '0'
                            ) MATCHING (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                PRODUTO_ID,
                                TAMANHO
                            );
                        END
                        ELSE
                        BEGIN
                            /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                            INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                REMESSA_TALAO_DETALHE_ID,      
                                CONTROLE,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE_ORIGINAL,  
                                QUANTIDADE_NECES,
                                QUANTIDADE_NECES_ALTERN,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA,   
                                SALDO_BAIXAR,
                                COMPONENTE
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :REMESSA_TALAO_DETALHE_ID,  
                                :CONTROLE2,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :QUANTIDADE,     
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                '0'
                            );
                        END
                    END
    
                    INCREMENTO = INCREMENTO+1;
                END
        
                OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
                  
                O_ESTABELECIMENTO_ID            = :ESTABELECIMENTO_ID      ;
                O_REMESSA_ID                    = :REMESSA_ID              ;
                O_REMESSA_TALAO_ID              = :REMESSA_TALAO_ID        ;
                O_CONTROLE                      = :CONTROLE2               ;
                O_LOCALIZACAO_ID                = :PROJECAO_LOCALIZACAO_ID ;
                O_PRODUTO_ID                    = :PROJECAO_PRODUTO_ID     ;
                O_TAMANHO                       = :PROJECAO_TAMANHO        ;
                O_DENSIDADE                     = :DENSIDADE               ;
                O_ESPESSURA                     = :ESPESSURA               ;
                O_QUANTIDADE                    = :CONSUMO_QUANTIDADE2     ;
                O_QUANTIDADE_ALTERNATIVA        = :CONSUMO_ALTERNATIVO2    ;
               -- SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO_GP (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer)
as
declare variable O_ESTABELECIMENTO_ID integer;
declare variable O_REMESSA_ID integer;
declare variable O_REMESSA_TALAO_ID integer;
declare variable O_CONTROLE integer;
declare variable O_LOCALIZACAO_ID integer;
declare variable O_PRODUTO_ID integer;
declare variable O_TAMANHO integer;
declare variable O_DENSIDADE numeric(15,2);
declare variable O_ESPESSURA numeric(15,2);
declare variable O_QUANTIDADE numeric(15,4);
declare variable O_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable TALAO_QUANTIDADE numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(3);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer;
declare variable OLD_DESTINO_FAMILIA_ID integer;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_VALORES varchar(500);
declare variable OLD_QUANTIDADE_ORIGINAL numeric(15,4);
declare variable OLD_QUANTIDADE numeric(15,4);
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_DIRETA integer;
declare variable PROJECAO_GP integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable GP_ID integer;
declare variable UM varchar(10);
declare variable CONSUMO_PERMITE_FRACAO varchar(10);
declare variable FAMILIA_MODELO_ID integer;
declare variable GERAR integer;
BEGIN
    /**
     * Limpa os registros atuais para poder recalcular
     */
    DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID;

    CONTROLE1 = 0;
    CONTROLE2 = 1;

    /**
     * Inicio do loop que carrega todos os taloes detalhados da remessa que foi parametrizada
     */
    FOR
        SELECT
            M.FAMILIA_CODIGO,
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            T.QUANTIDADE TALAO_QUANTIDADE,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P,
            TBMODELO M

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :Estabelecimento_Id
        AND D.REMESSA_ID         = :REMESSA_ID
        AND M.CODIGO             = P.MODELO_CODIGO
        AND T.REMESSA_TALAO_ID < 9000 /* Remove os taloes de sobra da remessa */

    INTO
        :FAMILIA_MODELO_ID,
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :TALAO_QUANTIDADE,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :GP_ID
    DO
    BEGIN
        /**
         * Variavel que vai verificar se sera gerada projecao de consumo direto do proprio talao (FAMILIA PROJECAO = FAMILIA TALAO)
         */
        PROJECAO_DIRETA = (SELECT FIRST 1 ACUMULA_PROJECAO
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_ID
                             AND A.FAMILIA_MODELO_ID = :FAMILIA_ID  
                             AND A.GP_ORIGEM         = :GP_ID
                             );

        /* Verifica se o item tem projecao de si mesmo (CACHARREL / EDC DIV. ESPUMAS) */
        IF (PROJECAO_DIRETA IS NOT NULL) THEN
        BEGIN

            /**
             * Codigo que ira referenciar pares de insumo
             */
            CONTROLE1            = COALESCE(CONTROLE1,0)+1;
            CONSUMO_QUANTIDADE1  = :QUANTIDADE;
            CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;

            /**
             * Verifica se ACUMULA PROJECAO
             */
            IF (PROJECAO_DIRETA = '1') THEN
            BEGIN

                OLD_VALORES =
                (SELECT FIRST 1
                       (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                        LPAD(COALESCE(QUANTIDADE            ,0),20)||
                        LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                FROM  VWREMESSA_CONSUMO
                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                  AND REMESSA_ID         = :REMESSA_ID
                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                  AND PRODUTO_ID         = :PRODUTO_ID
                  AND TAMANHO            = :TAMANHO
                );

                OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                    
--                QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
--                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
--                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;

--                QUANTIDADE           = TALAO_QUANTIDADE;
                --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;
    
                /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,  
                    :TALAO_QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    '0'
                ) MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    PRODUTO_ID,
                    TAMANHO
                );
            END
            ELSE
            BEGIN

                /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,      
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,  
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,    
                    :QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    '0'
                );
            END

        END
        ELSE
        BEGIN
    
            /**
             * Inicializa o loop que carrega e calcula a projecao de consumo do talao detalhado
             */
            FOR
                /* Consulta de Insumos Independente de Cor */
                SELECT
                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao,
                    1 FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO,

                    coalesce((SELECT FIRST 1 1
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                             AND A.FAMILIA_MODELO_ID = P.familia_codigo
                             AND (A.GP_ORIGEM         = :GP_ID or coalesce(A.GP_ORIGEM,0) = 0)
                             ),0) AS GERAR
    
                FROM
                    TBMODELO_CONSUMO B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_CODIGO          = :MODELO_ID
                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                AND B.MODELO_CODIGO          = M.CODIGO
                AND B.HABILITA_GERAR_CONSUMO = '1'
                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO              = '1' /* Carrega somente familias que geram consumo */
                
                UNION
                /* Consulta de Insumos por Cor */
                SELECT
                    B.PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Projecao,
                    B.FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO,

                    coalesce((SELECT FIRST 1 1
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                             AND A.FAMILIA_MODELO_ID = P.familia_codigo
                             AND (A.GP_ORIGEM         = :GP_ID or coalesce(A.GP_ORIGEM,0) = 0)
                             ),0) AS GERAR
    
                
                FROM
                    TBMODELO_CONSUMO_COR B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_ID      = :MODELO_ID
                AND B.COR_ID         = :COR_ID
                AND B.PRODUTO_ID     = P.CODIGO
                AND B.MODELO_ID      = M.CODIGO      
                AND B.HABILITA_GERAR_CONSUMO = '1'
                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO      = '1' /* Carrega somente familias que geram consumo */
            
            INTO
                :PROJECAO_PRODUTO_ID,
                :PROJECAO_TAMANHO,
                :PROJECAO_LOCALIZACAO_ID,
                :PROJECAO_QUANTIDADE,
                :FATOR_MULT,
                :FATOR_DIV,
                :DESTINO_FAMILIA_ID,
                :UM_ALTERNATIVA,
                :ACUMULA_PROJECAO,
                GERAR
        
            DO
            BEGIN
    
                IF(GERAR = 1)THEN
                BEGIN
                    /**
                     * Codigo que ira referenciar pares de insumo
                     */
                    IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                        (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                    THEN
                    BEGIN
                        CONTROLE2 = COALESCE(CONTROLE2,0)+1;
                    END
    
                    /**
                     * Inicio do loop que forma os pares de insumo caso FATOR_MULT for maior que 1
                     */
                    INCREMENTO = 1;
                    WHILE (INCREMENTO <= :FATOR_MULT) DO
                    BEGIN
    
                        /**
                         * Verifica se houve alguma projecao gerada
                         */
                        IF (:PROJECAO_QUANTIDADE > 0) THEN
                        BEGIN
                            /* Calcula as projecaes de consumo */
                            CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                            CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);
        
                            IF (ACUMULA_PROJECAO = '1') THEN
                            BEGIN
    
                                OLD_VALORES =
                                (SELECT FIRST 1
                                       (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                                        LPAD(COALESCE(QUANTIDADE            ,0),20)||
                                        LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                                FROM  VWREMESSA_CONSUMO
                                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                  AND REMESSA_ID         = :REMESSA_ID
                                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                  AND TAMANHO            = :PROJECAO_TAMANHO
                                );
        
                                OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                                OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                                OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                                    
    --                            QUANTIDADE           = TALAO_QUANTIDADE;
                                --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                                CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + OLD_QUANTIDADE;
                                CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + OLD_QUANTIDADE_ALTERNATIVA;
    
                                /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                                UPDATE OR INSERT INTO
                                VWREMESSA_CONSUMO (
                                    ESTABELECIMENTO_ID,
                                    REMESSA_ID,
                                    REMESSA_TALAO_ID,
                                    CONTROLE,
                                    LOCALIZACAO_ID,
                                    PRODUTO_ID,
                                    TAMANHO,
                                    DENSIDADE,
                                    ESPESSURA,
                                    QUANTIDADE_ORIGINAL,
                                    QUANTIDADE_NECES,
                                    QUANTIDADE_NECES_ALTERN,
                                    QUANTIDADE,
                                    QUANTIDADE_ALTERNATIVA,
                                    SALDO_BAIXAR,
                                    COMPONENTE
                                ) VALUES (
                                    :ESTABELECIMENTO_ID,
                                    :REMESSA_ID,
                                    :REMESSA_TALAO_ID,
                                    :CONTROLE2,
                                    :PROJECAO_LOCALIZACAO_ID,
                                    :PROJECAO_PRODUTO_ID,
                                    :PROJECAO_TAMANHO,
                                    :DENSIDADE,
                                    :ESPESSURA,
                                    :TALAO_QUANTIDADE,
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    '0'
                                ) MATCHING (
                                    ESTABELECIMENTO_ID,
                                    REMESSA_ID,
                                    REMESSA_TALAO_ID,
                                    PRODUTO_ID,
                                    TAMANHO
                                );
                            END
                            ELSE
                            BEGIN
                                /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                                INSERT INTO
                                VWREMESSA_CONSUMO (
                                    ESTABELECIMENTO_ID,
                                    REMESSA_ID,
                                    REMESSA_TALAO_ID,
                                    REMESSA_TALAO_DETALHE_ID,      
                                    CONTROLE,
                                    LOCALIZACAO_ID,
                                    PRODUTO_ID,
                                    TAMANHO,
                                    DENSIDADE,
                                    ESPESSURA,
                                    QUANTIDADE_ORIGINAL,  
                                    QUANTIDADE_NECES,
                                    QUANTIDADE_NECES_ALTERN,
                                    QUANTIDADE,
                                    QUANTIDADE_ALTERNATIVA,   
                                    SALDO_BAIXAR,
                                    COMPONENTE
                                ) VALUES (
                                    :ESTABELECIMENTO_ID,
                                    :REMESSA_ID,
                                    :REMESSA_TALAO_ID,
                                    :REMESSA_TALAO_DETALHE_ID,  
                                    :CONTROLE2,
                                    :PROJECAO_LOCALIZACAO_ID,
                                    :PROJECAO_PRODUTO_ID,
                                    :PROJECAO_TAMANHO,
                                    :DENSIDADE,
                                    :ESPESSURA,
                                    :QUANTIDADE,     
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    '0'
                                );
                            END
                        END
        
                        INCREMENTO = INCREMENTO+1;
                    END
            
                    OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                    OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
                      
                    O_ESTABELECIMENTO_ID            = :ESTABELECIMENTO_ID      ;
                    O_REMESSA_ID                    = :REMESSA_ID              ;
                    O_REMESSA_TALAO_ID              = :REMESSA_TALAO_ID        ;
                    O_CONTROLE                      = :CONTROLE2               ;
                    O_LOCALIZACAO_ID                = :PROJECAO_LOCALIZACAO_ID ;
                    O_PRODUTO_ID                    = :PROJECAO_PRODUTO_ID     ;
                    O_TAMANHO                       = :PROJECAO_TAMANHO        ;
                    O_DENSIDADE                     = :DENSIDADE               ;
                    O_ESPESSURA                     = :ESPESSURA               ;
                    O_QUANTIDADE                    = :CONSUMO_QUANTIDADE2     ;
                    O_QUANTIDADE_ALTERNATIVA        = :CONSUMO_ALTERNATIVO2    ;
                END
            END
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO_GP_V2 (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer)
as
declare variable O_ESTABELECIMENTO_ID integer;
declare variable O_REMESSA_ID integer;
declare variable O_REMESSA_TALAO_ID integer;
declare variable O_CONTROLE integer;
declare variable O_LOCALIZACAO_ID integer;
declare variable O_PRODUTO_ID integer;
declare variable O_TAMANHO integer;
declare variable O_DENSIDADE numeric(15,2);
declare variable O_ESPESSURA numeric(15,2);
declare variable O_QUANTIDADE numeric(15,4);
declare variable O_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable TALAO_QUANTIDADE numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(3);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer;
declare variable OLD_DESTINO_FAMILIA_ID integer;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_VALORES varchar(500);
declare variable OLD_QUANTIDADE_ORIGINAL numeric(15,4);
declare variable OLD_QUANTIDADE numeric(15,4);
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_DIRETA integer;
declare variable PROJECAO_GP integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable GP_ID integer;
declare variable UM varchar(10);
declare variable CONSUMO_PERMITE_FRACAO varchar(10);
declare variable FAMILIA_MODELO_ID integer;
declare variable GERAR integer;
declare variable SETOR_ID integer;
BEGIN
    /**
     * Limpa os registros atuais para poder recalcular
     */
    DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID;

    CONTROLE1 = 0;
    CONTROLE2 = 1;

    /**
     * Inicio do loop que carrega todos os taloes detalhados da remessa que foi parametrizada
     */
    FOR
        SELECT
            M.FAMILIA_CODIGO,
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            T.QUANTIDADE TALAO_QUANTIDADE,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P,
            TBMODELO M

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :Estabelecimento_Id
        AND D.REMESSA_ID         = :REMESSA_ID
        AND M.CODIGO             = P.MODELO_CODIGO
        AND T.REMESSA_TALAO_ID < 9000 /* Remove os taloes de sobra da remessa */

    INTO
        :FAMILIA_MODELO_ID,
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :TALAO_QUANTIDADE,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :GP_ID
    DO
    BEGIN
        /**
         * Variavel que vai verificar se sera gerada projecao de consumo direto do proprio talao (FAMILIA PROJECAO = FAMILIA TALAO)
         */
        PROJECAO_DIRETA = (SELECT FIRST 1 ACUMULA_PROJECAO
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_ID
                             AND A.FAMILIA_MODELO_ID = :FAMILIA_ID  
                             AND A.GP_ORIGEM         = :GP_ID
                             );

        /* Verifica se o item tem projecao de si mesmo (CACHARREL / EDC DIV. ESPUMAS) */
        IF (PROJECAO_DIRETA IS NOT NULL) THEN
        BEGIN

            /**
             * Codigo que ira referenciar pares de insumo
             */
            CONTROLE1            = COALESCE(CONTROLE1,0)+1;
            CONSUMO_QUANTIDADE1  = :QUANTIDADE;
            CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;

            /**
             * Verifica se ACUMULA PROJECAO
             */
            IF (PROJECAO_DIRETA = '1') THEN
            BEGIN

                OLD_VALORES =
                (SELECT FIRST 1
                       (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                        LPAD(COALESCE(QUANTIDADE            ,0),20)||
                        LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                FROM  VWREMESSA_CONSUMO
                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                  AND REMESSA_ID         = :REMESSA_ID
                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                  AND PRODUTO_ID         = :PRODUTO_ID
                  AND TAMANHO            = :TAMANHO
                );

                OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                    
--                QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
--                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
--                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;

--                QUANTIDADE           = TALAO_QUANTIDADE;
                --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;
    
                /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,  
                    :TALAO_QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    '0'
                ) MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    PRODUTO_ID,
                    TAMANHO
                );
            END
            ELSE
            BEGIN

                /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,      
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,  
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,    
                    :QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    '0'
                );
            END

        END
        ELSE
        BEGIN
    
            /**
             * Inicializa o loop que carrega e calcula a projecao de consumo do talao detalhado
             */
            FOR
                /* Consulta de Insumos Independente de Cor */
                SELECT
                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao,
                    1 FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO,

                    coalesce((SELECT FIRST 1 1
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                             AND A.FAMILIA_MODELO_ID = P.familia_codigo
                             AND (A.GP_ORIGEM         = :GP_ID or coalesce(A.GP_ORIGEM,0) = 0)
                             ),0) AS GERAR,

                    b.setor_codigo as SETOR_ID
    
                FROM
                    TBMODELO_CONSUMO B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_CODIGO          = :MODELO_ID
                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                AND B.MODELO_CODIGO          = M.CODIGO
                AND B.HABILITA_GERAR_CONSUMO = '1'
                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO              = '1' /* Carrega somente familias que geram consumo */
                
                UNION
                /* Consulta de Insumos por Cor */
                SELECT
                    B.PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Projecao,
                    B.FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO,

                    coalesce((SELECT FIRST 1 1
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                             AND A.FAMILIA_MODELO_ID = P.familia_codigo
                             AND (A.GP_ORIGEM         = :GP_ID or coalesce(A.GP_ORIGEM,0) = 0)
                             ),0) AS GERAR,
    
                   b.SETOR_ID as SETOR_ID
                FROM
                    TBMODELO_CONSUMO_COR B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_ID      = :MODELO_ID
                AND B.COR_ID         = :COR_ID
                AND B.PRODUTO_ID     = P.CODIGO
                AND B.MODELO_ID      = M.CODIGO      
                AND B.HABILITA_GERAR_CONSUMO = '1'
                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO      = '1' /* Carrega somente familias que geram consumo */
            
            INTO
                :PROJECAO_PRODUTO_ID,
                :PROJECAO_TAMANHO,
                :PROJECAO_LOCALIZACAO_ID,
                :PROJECAO_QUANTIDADE,
                :FATOR_MULT,
                :FATOR_DIV,
                :DESTINO_FAMILIA_ID,
                :UM_ALTERNATIVA,
                :ACUMULA_PROJECAO,
                :GERAR,
                :SETOR_ID
        
            DO
            BEGIN
    
                IF(GERAR = 1)THEN
                BEGIN
                    /**
                     * Codigo que ira referenciar pares de insumo
                     */
                    IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                        (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                    THEN
                    BEGIN
                        CONTROLE2 = COALESCE(CONTROLE2,0)+1;
                    END
    
                    /**
                     * Inicio do loop que forma os pares de insumo caso FATOR_MULT for maior que 1
                     */
                    INCREMENTO = 1;
                    WHILE (INCREMENTO <= :FATOR_MULT) DO
                    BEGIN
    
                        /**
                         * Verifica se houve alguma projecao gerada
                         */
                        IF (:PROJECAO_QUANTIDADE > 0) THEN
                        BEGIN
                            /* Calcula as projecaes de consumo */
                            CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                            CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);
        
                            IF (ACUMULA_PROJECAO = '1') THEN
                            BEGIN
    
                                OLD_VALORES =
                                (SELECT FIRST 1
                                       (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                                        LPAD(COALESCE(QUANTIDADE            ,0),20)||
                                        LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                                FROM  VWREMESSA_CONSUMO
                                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                  AND REMESSA_ID         = :REMESSA_ID
                                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                  AND TAMANHO            = :PROJECAO_TAMANHO
                                );
        
                                OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                                OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                                OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                                    
    --                            QUANTIDADE           = TALAO_QUANTIDADE;
                                --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                                CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + OLD_QUANTIDADE;
                                CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + OLD_QUANTIDADE_ALTERNATIVA;
    
                                /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                                UPDATE OR INSERT INTO
                                VWREMESSA_CONSUMO_V2 (
                                    ESTABELECIMENTO_ID,
                                    REMESSA_ID,
                                    REMESSA_TALAO_ID,
                                    CONTROLE,
                                    LOCALIZACAO_ID,
                                    PRODUTO_ID,
                                    TAMANHO,
                                    DENSIDADE,
                                    ESPESSURA,
                                    QUANTIDADE_ORIGINAL,
                                    QUANTIDADE_NECES,
                                    QUANTIDADE_NECES_ALTERN,
                                    QUANTIDADE,
                                    QUANTIDADE_ALTERNATIVA,
                                    SALDO_BAIXAR,
                                    COMPONENTE,
                                    SETOR_ID
                                ) VALUES (
                                    :ESTABELECIMENTO_ID,
                                    :REMESSA_ID,
                                    :REMESSA_TALAO_ID,
                                    :CONTROLE2,
                                    :PROJECAO_LOCALIZACAO_ID,
                                    :PROJECAO_PRODUTO_ID,
                                    :PROJECAO_TAMANHO,
                                    :DENSIDADE,
                                    :ESPESSURA,
                                    :TALAO_QUANTIDADE,
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    '0',
                                    :SETOR_ID
                                ) MATCHING (
                                    ESTABELECIMENTO_ID,
                                    REMESSA_ID,
                                    REMESSA_TALAO_ID,
                                    PRODUTO_ID,
                                    TAMANHO
                                );
                            END
                            ELSE
                            BEGIN
                                /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                                INSERT INTO
                                VWREMESSA_CONSUMO_V2 (
                                    ESTABELECIMENTO_ID,
                                    REMESSA_ID,
                                    REMESSA_TALAO_ID,
                                    REMESSA_TALAO_DETALHE_ID,      
                                    CONTROLE,
                                    LOCALIZACAO_ID,
                                    PRODUTO_ID,
                                    TAMANHO,
                                    DENSIDADE,
                                    ESPESSURA,
                                    QUANTIDADE_ORIGINAL,  
                                    QUANTIDADE_NECES,
                                    QUANTIDADE_NECES_ALTERN,
                                    QUANTIDADE,
                                    QUANTIDADE_ALTERNATIVA,   
                                    SALDO_BAIXAR,
                                    COMPONENTE,
                                    SETOR_ID
                                ) VALUES (
                                    :ESTABELECIMENTO_ID,
                                    :REMESSA_ID,
                                    :REMESSA_TALAO_ID,
                                    :REMESSA_TALAO_DETALHE_ID,  
                                    :CONTROLE2,
                                    :PROJECAO_LOCALIZACAO_ID,
                                    :PROJECAO_PRODUTO_ID,
                                    :PROJECAO_TAMANHO,
                                    :DENSIDADE,
                                    :ESPESSURA,
                                    :QUANTIDADE,     
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    :CONSUMO_ALTERNATIVO2, 
                                    :CONSUMO_QUANTIDADE2,
                                    '0',
                                    :SETOR_ID
                                );
                            END
                        END
        
                        INCREMENTO = INCREMENTO+1;
                    END
            
                    OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                    OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
                      
                    O_ESTABELECIMENTO_ID            = :ESTABELECIMENTO_ID      ;
                    O_REMESSA_ID                    = :REMESSA_ID              ;
                    O_REMESSA_TALAO_ID              = :REMESSA_TALAO_ID        ;
                    O_CONTROLE                      = :CONTROLE2               ;
                    O_LOCALIZACAO_ID                = :PROJECAO_LOCALIZACAO_ID ;
                    O_PRODUTO_ID                    = :PROJECAO_PRODUTO_ID     ;
                    O_TAMANHO                       = :PROJECAO_TAMANHO        ;
                    O_DENSIDADE                     = :DENSIDADE               ;
                    O_ESPESSURA                     = :ESPESSURA               ;
                    O_QUANTIDADE                    = :CONSUMO_QUANTIDADE2     ;
                    O_QUANTIDADE_ALTERNATIVA        = :CONSUMO_ALTERNATIVO2    ;
                END
            END
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO_TALAO (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    I_REMESSA_TALAO_ID integer)
as
declare variable O_ESTABELECIMENTO_ID integer;
declare variable O_REMESSA_ID integer;
declare variable O_REMESSA_TALAO_ID integer;
declare variable O_CONTROLE integer;
declare variable O_LOCALIZACAO_ID integer;
declare variable O_PRODUTO_ID integer;
declare variable O_TAMANHO integer;
declare variable O_DENSIDADE numeric(15,2);
declare variable O_ESPESSURA numeric(15,2);
declare variable O_QUANTIDADE numeric(15,4);
declare variable O_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(3);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer;
declare variable OLD_DESTINO_FAMILIA_ID integer;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_VALORES varchar(500);
declare variable OLD_QUANTIDADE_ORIGINAL numeric(15,4);
declare variable OLD_QUANTIDADE numeric(15,4);
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_DIRETA integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable GP_ID integer;
BEGIN
    /**
     * Limpa os registros atuais para poder recalcular
     */
    --DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID;

    CONTROLE1 = 0;
    CONTROLE2 = 1;

    /**
     * Inicio do loop que carrega todos os taloes detalhados da remessa que foi parametrizada
     */
    FOR
        SELECT
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :Estabelecimento_Id
        AND D.REMESSA_ID         = :REMESSA_ID
        AND D.REMESSA_TALAO_ID   = :I_REMESSA_TALAO_ID
        AND T.REMESSA_TALAO_ID < 9000 /* Remove os taloes de sobra da remessa */

    INTO
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :GP_ID
    DO
    BEGIN
        /**
         * Variavel que vai verificar se sera gerada projecao de consumo direto do proprio talao (FAMILIA PROJECAO = FAMILIA TALAO)
         */
        PROJECAO_DIRETA = (SELECT FIRST 1 ACUMULA_PROJECAO
                           FROM TBFAMILIA_MODELO_ALOCACAO A
                           WHERE A.FAMILIA_ID        = :FAMILIA_ID
                             AND A.FAMILIA_MODELO_ID = :FAMILIA_ID  
                             AND A.GP_ORIGEM         = :GP_ID
                             );

        /* Verifica se o item tem projecao de si mesmo (CACHARREL / EDC DIV. ESPUMAS) */
        IF (PROJECAO_DIRETA IS NOT NULL) THEN
        BEGIN

            /**
             * Codigo que ira referenciar pares de insumo
             */
            CONTROLE1            = COALESCE(CONTROLE1,0)+1;
            CONSUMO_QUANTIDADE1  = :QUANTIDADE;
            CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;

            /**
             * Verifica se ACUMULA PROJECAO
             */
            IF (PROJECAO_DIRETA = '1') THEN
            BEGIN

                OLD_VALORES =
                (SELECT FIRST 1
                       (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                        LPAD(COALESCE(QUANTIDADE            ,0),20)||
                        LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                FROM  VWREMESSA_CONSUMO
                WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                  AND REMESSA_ID         = :REMESSA_ID
                  AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                  AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                  AND TAMANHO            = :PROJECAO_TAMANHO
                );

                OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                    
                QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;

    
                /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                UPDATE OR INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,  
                    :QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1,
                    :CONSUMO_QUANTIDADE1,
                    '0'
                ) MATCHING (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    PRODUTO_ID,
                    TAMANHO
                );
            END
            ELSE
            BEGIN

                /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                INSERT INTO
                VWREMESSA_CONSUMO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    REMESSA_TALAO_DETALHE_ID,      
                    CONTROLE,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    TAMANHO,
                    DENSIDADE,
                    ESPESSURA,
                    QUANTIDADE_ORIGINAL,
                    QUANTIDADE_NECES,
                    QUANTIDADE_NECES_ALTERN,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    SALDO_BAIXAR,
                    COMPONENTE
                ) VALUES (
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,  
                    :CONTROLE1,
                    :LOCALIZACAO_ID,
                    :PRODUTO_ID,
                    :TAMANHO,
                    :DENSIDADE,
                    :ESPESSURA,    
                    :QUANTIDADE,
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    :CONSUMO_ALTERNATIVO1, 
                    :CONSUMO_QUANTIDADE1,
                    '0'
                );
            END

        END
        ELSE
        BEGIN
    
            /**
             * Inicializa o loop que carrega e calcula a projecao de consumo do talao detalhado
             */
            FOR
                /* Consulta de Insumos Independente de Cor */
                SELECT
                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Projecao,
                    1 FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                FROM
                    TBMODELO_CONSUMO B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_CODIGO          = :MODELO_ID
                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                AND B.MODELO_CODIGO          = M.CODIGO
                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO              = '1' /* Carrega somente familias que geram consumo */
                
                UNION
                /* Consulta de Insumos por Cor */
                SELECT
                    B.PRODUTO_ID,
                    B.Tam TAMANHO,
                    P.Localizacao_Codigo LOCALIZACAO_ID,
                    Cast((
                    (Case When (Cast(:Tamanho as integer)= 0) and (B.QUANTIDADE > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
                    (Case When (Cast(:Tamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Projecao,
                    B.FATOR_MATRIZ,
                    B.FATOR_CONVERSAO,
                    FMA.FAMILIA_MODELO_ID,
                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO2 FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                    FMA.ACUMULA_PROJECAO
    
                
                FROM
                    TBMODELO_CONSUMO_COR B,
                    TBMODELO M,
                    TBPRODUTO P,
                    TBFAMILIA_MODELO_ALOCACAO FMA
    
                WHERE
                    B.MODELO_ID      = :MODELO_ID
                AND B.COR_ID         = :COR_ID
                AND B.PRODUTO_ID     = P.CODIGO
                AND B.MODELO_ID      = M.CODIGO
                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                AND FMA.CONSUMO      = '1' /* Carrega somente familias que geram consumo */
            
            INTO
                :PROJECAO_PRODUTO_ID,
                :PROJECAO_TAMANHO,
                :PROJECAO_LOCALIZACAO_ID,
                :PROJECAO_QUANTIDADE,
                :FATOR_MULT,
                :FATOR_DIV,
                :DESTINO_FAMILIA_ID,
                :UM_ALTERNATIVA,
                :ACUMULA_PROJECAO
        
            DO
            BEGIN
    
                /**
                 * Codigo que ira referenciar pares de insumo
                 */
                IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                    (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                THEN
                BEGIN
                    CONTROLE2 = COALESCE(CONTROLE2,0)+1;
                END

                /**
                 * Inicio do loop que forma os pares de insumo caso FATOR_MULT for maior que 1
                 */
                INCREMENTO = 1;
                WHILE (INCREMENTO <= :FATOR_MULT) DO
                BEGIN

                    /**
                     * Verifica se houve alguma projecao gerada
                     */
                    IF (:PROJECAO_QUANTIDADE > 0) THEN
                    BEGIN
                        /* Calcula as projecaes de consumo */
                        CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                        CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);
    
                        IF (ACUMULA_PROJECAO = '1') THEN
                        BEGIN

                            OLD_VALORES =
                            (SELECT FIRST 1
                                   (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                                    LPAD(COALESCE(QUANTIDADE            ,0),20)||
                                    LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                            FROM  VWREMESSA_CONSUMO
                            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                              AND REMESSA_ID         = :REMESSA_ID
                              AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                              AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                              AND TAMANHO            = :PROJECAO_TAMANHO
                            );
    
                            OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                            OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                            OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                                
                            QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                            CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + OLD_QUANTIDADE;
                            CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + OLD_QUANTIDADE_ALTERNATIVA;

                            /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
                            UPDATE OR INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                CONTROLE,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE_ORIGINAL,
                                QUANTIDADE_NECES,
                                QUANTIDADE_NECES_ALTERN,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA,
                                SALDO_BAIXAR,
                                COMPONENTE
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :CONTROLE2,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :QUANTIDADE,      
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                '0'
                            ) MATCHING (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                PRODUTO_ID,
                                TAMANHO
                            );
                        END
                        ELSE
                        BEGIN
                            /* Insere o consumo na tabela (PROJECAO NAO ACUMULADA) */
                            INSERT INTO
                            VWREMESSA_CONSUMO (
                                ESTABELECIMENTO_ID,
                                REMESSA_ID,
                                REMESSA_TALAO_ID,
                                REMESSA_TALAO_DETALHE_ID,      
                                CONTROLE,
                                LOCALIZACAO_ID,
                                PRODUTO_ID,
                                TAMANHO,
                                DENSIDADE,
                                ESPESSURA,
                                QUANTIDADE_ORIGINAL,  
                                QUANTIDADE_NECES,
                                QUANTIDADE_NECES_ALTERN,
                                QUANTIDADE,
                                QUANTIDADE_ALTERNATIVA,   
                                SALDO_BAIXAR,
                                COMPONENTE
                            ) VALUES (
                                :ESTABELECIMENTO_ID,
                                :REMESSA_ID,
                                :REMESSA_TALAO_ID,
                                :REMESSA_TALAO_DETALHE_ID,  
                                :CONTROLE2,
                                :PROJECAO_LOCALIZACAO_ID,
                                :PROJECAO_PRODUTO_ID,
                                :PROJECAO_TAMANHO,
                                :DENSIDADE,
                                :ESPESSURA,
                                :QUANTIDADE,     
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                :CONSUMO_ALTERNATIVO2, 
                                :CONSUMO_QUANTIDADE2,
                                '0'
                            );
                        END
                    END
    
                    INCREMENTO = INCREMENTO+1;
                END
        
                OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
                  
                O_ESTABELECIMENTO_ID            = :ESTABELECIMENTO_ID      ;
                O_REMESSA_ID                    = :REMESSA_ID              ;
                O_REMESSA_TALAO_ID              = :REMESSA_TALAO_ID        ;
                O_CONTROLE                      = :CONTROLE2               ;
                O_LOCALIZACAO_ID                = :PROJECAO_LOCALIZACAO_ID ;
                O_PRODUTO_ID                    = :PROJECAO_PRODUTO_ID     ;
                O_TAMANHO                       = :PROJECAO_TAMANHO        ;
                O_DENSIDADE                     = :DENSIDADE               ;
                O_ESPESSURA                     = :ESPESSURA               ;
                O_QUANTIDADE                    = :CONSUMO_QUANTIDADE2     ;
                O_QUANTIDADE_ALTERNATIVA        = :CONSUMO_ALTERNATIVO2    ;
               -- SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_proc_b0u_02 for tbpedido_item_processado
active before update position 0
AS
DECLARE VARIABLE UM_ALTERNATIVA CHAR(1);
DECLARE VARIABLE DADOS_APROVEITAMENTO VARCHAR(40);
DECLARE VARIABLE DEFEITOS NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_APROVEIT NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_APROVEIT_ALTERN NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_PRODUCAO NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_PRODUCAO_ALTERN NUMERIC(15,4);
DECLARE VARIABLE TALAO_PRODUTO_DESCRICAO VARCHAR(100);
Declare variable WEB Char(1);
Begin

  WEB = Coalesce((Select First 1 R.WEB From TbRemessa R Where R.Numero = New.Remessa),'0');
  IF (COALESCE(WEB,'0') = '1' ) THEN
      Begin

        /* ESTA TRIGGER SO SERA PROCESSADA NAS NOVAS REMESSAS (GCWEB) */
        IF ( COALESCE(OLD.FAMILIA_CODIGO,0) = 0 ) THEN
        BEGIN
    
            /* 2 - EM PRODUCAO ; 3 - PRODUZIDO */
            IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 3 AND NEW.situacao <> 6) THEN
            BEGIN
                TALAO_PRODUTO_DESCRICAO = '';

                SELECT FIRST 1
                    P.DESCRICAO
                FROM
                    TBPRODUTO P
                WHERE
                    P.CODIGO = NEW.PRODUTO_CODIGO
                INTO
                    TALAO_PRODUTO_DESCRICAO
                ;
                    
    
                UM_ALTERNATIVA = (SELECT FIRST 1 IIF((TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2)='') OR F.UNIDADEMEDIDA_ALTERNATIVO2 IS NULL,'0','1')
                                  FROM TBFAMILIA F
                                  WHERE F.CODIGO = (SELECT FIRST 1 FAMILIA_CODIGO
                                                    FROM TBPRODUTO P
                                                    WHERE P.CODIGO = OLD.PRODUTO_CODIGO));
    
    
                /* Guarda os valores do aproveitamento */
                DADOS_APROVEITAMENTO = (SELECT FIRST 1
                                            LPAD(COALESCE(V.QUANTIDADE,0),20) ||
                                            LPAD(COALESCE(V.QUANTIDADE_ALTERNATIVA,0),20)
                                        FROM
                                            RDB$DATABASE
                                            LEFT JOIN
                                            TBREMESSA_TALAO_VINCULO V ON
                                            V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                        AND V.STATUS                   = '0');
    
                QUANTIDADE_APROVEIT        = CAST(SUBSTRING(DADOS_APROVEITAMENTO FROM  1 FOR 20) AS NUMERIC(15,4));
                QUANTIDADE_APROVEIT_ALTERN = CAST(SUBSTRING(DADOS_APROVEITAMENTO FROM 21 FOR 20) AS NUMERIC(15,4));
    
                /* Guarda os valores produzidos */
                QUANTIDADE_PRODUCAO        = OLD.QUANTIDADE_PRODUCAO_TMP + QUANTIDADE_APROVEIT;
                QUANTIDADE_PRODUCAO_ALTERN = OLD.QUANTIDADE_ALTERN_PRODUCAO_TMP + QUANTIDADE_APROVEIT_ALTERN;
    
                /* Zera as quantidades temporarias */
    --            NEW.QUANTIDADE_PRODUCAO_TMP        = 0;
    --            NEW.QUANTIDADE_ALTERN_PRODUCAO_TMP = 0;
    
                /* VERIFICA SE A FAMILIA DO PRODUTO TEM UNIDADE DE MEDIDA ALTERNATIVA CONFIGURADA */
                IF (UM_ALTERNATIVA = '1') THEN
                BEGIN
                    /* VERIFICA SE QUANTIDADE ALTERNATIVA TEMPORARIA PRODUZIDA ESTA MAIOR QUE ZERO */
                    IF ( NOT ( QUANTIDADE_PRODUCAO_ALTERN > 0 ) ) THEN
                    BEGIN
                        EXCEPTION "..." 'FAMILIA DO PRODUTO ' || TALAO_PRODUTO_DESCRICAO || ' CONFIGURADA COM UNIDADE DE MEDIDA ALTERNATIVA. QUANTIDADE ALTERNATIVA DEVERA SER MAIOR QUE ZERO. OPERACAO CANCELADA! ';

                    END
                END

        
                DEFEITOS = COALESCE((
                    SELECT SUM(A.QUANTIDADE)
                    FROM
                        VWREMESSA_TALAO_DETALHE D,
                        TBDEFEITO_TRANSACAO_ITEM A,
                        TBSAC_DEFEITO B
                    WHERE TRUE
                    AND D.ID                = NEW.CONTROLE
                    AND A.REMESSA           = D.REMESSA_ID
                    AND A.REMESSA_CONTROLE  = D.ID
                    AND B.CODIGO            = A.DEFEITO_ID),0);
    
                /* VERIFICA SE QUANTIDADE PRODUZIDA TEMPORARIA ETA MAIOR QUE ZERO */
                IF ( NOT (NEW.QUANTIDADE_PEDIDO = DEFEITOS) AND NOT ((QUANTIDADE_PRODUCAO)  > 0) ) THEN
                BEGIN
                    EXCEPTION "..." 'QUANTIDADE PRODUZIDA DEVERA SER MAIOR QUE ZERO NO PRODUTO ' || TALAO_PRODUTO_DESCRICAO || ', QTD.PED:'||NEW.QUANTIDADE_PEDIDO||', QTD.PROD:'||:QUANTIDADE_PRODUCAO||'. OPERACAO CANCELADA!';

                END
    
                /* Grava os valores produzidos*/
                NEW.QUANTIDADE_PRODUCAO         = QUANTIDADE_PRODUCAO;
                NEW.QUANTIDADE_SALDO            = QUANTIDADE_PRODUCAO;
                NEW.QUANTIDADE_ALTERN_PRODUCAO  = QUANTIDADE_PRODUCAO_ALTERN;
                NEW.QUANTIDADE_ALTERN_SALDO     = QUANTIDADE_PRODUCAO_ALTERN;
    
                /* Grava data e hora de producao */
                /* a fleg he para manter a data na importacao de taloes na espumacao */
                if(coalesce(new.flag_data,0) = 0)then
                begin
                    NEW.DATA_PRODUCAO = CURRENT_DATE;
                    NEW.HORA_PRODUCAO = CURRENT_TIME;
                end
    
                /* GERA SOBRA DE PRODUÇÃO*/
                IF ( OLD.quantidade_sobra_tmp > 0) THEN
                BEGIN

                    UPDATE OR INSERT INTO TBREVISAO (
                        ESTABELECIMENTO_ID,
                        PRODUTO_ID,
                        TAMANHO,
                        DATA_REVISAO,
                        OPERADOR_ID,
                        DATAHORA_COLETA,
                        PESO_LIQUIDO,
                        SALDO,
                        METRAGEM,
                        TALAO_ID,
                        NFE_ID,
                        OB
                    ) VALUES(
                        OLD.ESTABELECIMENTO_CODIGO,
                        OLD.PRODUTO_CODIGO,
                        OLD.TAMANHO,
                        CURRENT_DATE,
                        OLD.OPERADOR,
                        CURRENT_TIMESTAMP,
                        OLD.QUANTIDADE_SOBRA_TMP,
                        OLD.QUANTIDADE_SOBRA_TMP,
                        OLD.QUANTIDADE_SOBRA_TMP,
                        OLD.CONTROLE ,
                        0,
                        0
                    ) MATCHING (TALAO_ID);
                END
    
                NEW.quantidade_sobra      = OLD.QUANTIDADE_SOBRA_TMP;
    
                /* ATUALIZA O STATUS PARA UTILIZADO DO APROVEITAMENTO */
                UPDATE TBREMESSA_TALAO_VINCULO V SET
                    V.STATUS = '1'
                WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE;
    
            END
    
        END
      END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_talao_vinculo_b4i for tbremessa_talao_vinculo
active before insert or update position 4
AS
DECLARE VARIABLE UM_ALTERNATIVA INTEGER;
--DECLARE VARIABLE TALAO_DADOS VARCHAR(200);
--declare variable TALAO_LOCALIZACAO_ID INTEGER;
--DECLARE VARIABLE TALAO_LOCALIZACAO_DESCRICAO VARCHAR(100);
DECLARE VARIABLE DATAHORA_PRODUCAO TIMESTAMP;
DECLARE VARIABLE LIB CHAR(1);
DECLARE VARIABLE HORAS_BLOQUEIO INTEGER;
DECLARE VARIABLE HORAS_CORRIDAS INTEGER;
DECLARE VARIABLE HORAS_TOLERANCIA INTEGER;

--DECLARE VARIABLE CONSUMO_DADOS VARCHAR(200);
--declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
--DECLARE VARIABLE CONSUMO_LOCALIZACAO_DESCRICAO VARCHAR(100);

declare variable CONSUMO_ALTERNATIVO NUMERIC(15,4);
declare variable PRODUTO_INVENTARIO CHAR(1);
declare variable PRODUTOS_DISPONIVEIS VARCHAR(3000);
declare variable PRODUTO_ID INTEGER;
declare variable TAMANHO INTEGER;

BEGIN

    IF ( NEW.TIPO = 'D' AND INSERTING ) THEN
    BEGIN

        for
        SELECT FIRST 1 D.PRODUTO_ID, D.TAMANHO, D.DATAHORA_PRODUCAO, Coalesce(D.LIB,'0'), M.HORAS_BLOQUEIO, DatedIFF(hour,d.DATAHORA_PRODUCAO,current_timestamp), M.HORAS_BLOQUEIO + M.HORAS_TOLERANCIA
          FROM VWREMESSA_TALAO_DETALHE D, TBMODELO M
         WHERE D.ID = NEW.TABELA_ID
           AND D.MODELO_ID = M.CODIGO
           and M.HORAS_BLOQUEIO > 0
          INTO PRODUTO_ID, TAMANHO, :DATAHORA_PRODUCAO, :LIB, :HORAS_BLOQUEIO, HORAS_CORRIDAS, HORAS_TOLERANCIA
            DO
            BEGIN
                IF (:LIB = '0' AND :HORAS_BLOQUEIO > 0 AND :HORAS_CORRIDAS < :HORAS_BLOQUEIO) THEN
                BEGIN
                    EXCEPTION "..." 'ESSE PRODUTO FOI PRODUZIDO EM '||:DATAHORA_PRODUCAO||' E PRECISA DE '||:HORAS_BLOQUEIO||' HORAS PODER SER UTILIZADO. AGUARDE '|| CAST((:HORAS_BLOQUEIO-:HORAS_CORRIDAS) AS VARCHAR(5)) ||' HORAS PARA UTILIZA-LO!';
                END


                IF ( FN_PARAMETRO('SISTEMA.PECA_BLOQUEIO_RECENTE') = 1 AND HORAS_TOLERANCIA > 0 AND HORAS_CORRIDAS < HORAS_TOLERANCIA ) THEN
                BEGIN

                    PRODUTOS_DISPONIVEIS =
                       (SELECT LIST(STRING,'')
                          FROM (
                            SELECT FIRST 4
                                   '<tr><td>' || D.ID || '</td><td>' || FN_TIMESTAMP_TO_STRING(D.DATAHORA_PRODUCAO) || '</td></tr>' STRING,
                                   DATEDIFF(HOUR,D.DATAHORA_PRODUCAO,CURRENT_TIMESTAMP) DIF
                              FROM VWREMESSA_TALAO_DETALHE D,TBMODELO M, TBFAMILIA F
                             WHERE M.CODIGO = D.MODELO_ID
                               AND M.FAMILIA_CODIGO = F.CODIGO
                               AND D.QUANTIDADE_SALDO > 0
                               AND D.PRODUTO_ID = :PRODUTO_ID
                               AND D.TAMANHO = :TAMANHO
                               AND DATEDIFF(HOUR,D.DATAHORA_PRODUCAO,CURRENT_TIMESTAMP) >= :HORAS_TOLERANCIA
                               AND F.LOCALIZACAO_CODIGO = D.LOCALIZACAO_ID
                             ORDER BY DIF DESC)X);

                    IF ( PRODUTOS_DISPONIVEIS IS NOT NULL ) THEN
                    BEGIN
                        EXCEPTION "..." 'ESTE PRODUTO FOI PRODUZIDO A MENOS DE ' || HORAS_TOLERANCIA || ' HORAS. UTILIZACAO NAO PERMITIDA. UTILIZE ALGUMA DAS PECAS A SEGUIR: ' || FN_LINE(1,'<br/>') ||
                        '<table><tr><th>Peça</th><th>Dt/Hr Prod.</th></tr>' || PRODUTOS_DISPONIVEIS || '</table>';
                    END

                END
            END

          /*
        TALAO_DADOS = (SELECT FIRST 1 LPAD(D.LOCALIZACAO_ID,20) ||  RPAD(L.DESCRICAO,100)||

                         FROM VWREMESSA_TALAO_DETALHE D,
                              TBLOCALIZACAO L
                        WHERE L.CODIGO = D.LOCALIZACAO_ID
                          AND D.ID = NEW.TABELA_ID);

        TALAO_LOCALIZACAO_ID        = CAST(SUBSTRING(TALAO_DADOS FROM  1 FOR  20) AS INTEGER);
        TALAO_LOCALIZACAO_DESCRICAO = TRIM(CAST(SUBSTRING(TALAO_DADOS FROM 21 FOR 100) AS VARCHAR(100)));
           
        CONSUMO_DADOS = (SELECT FIRST 1 LPAD(C.LOCALIZACAO_ID,20) || RPAD(L.DESCRICAO,100)
                           FROM VWREMESSA_CONSUMO C,
                                TBLOCALIZACAO L
                          WHERE L.CODIGO = C.LOCALIZACAO_ID
                            AND C.ID = NEW.CONSUMO_ID);

        CONSUMO_LOCALIZACAO_ID        = CAST(SUBSTRING(CONSUMO_DADOS FROM  1 FOR  20) AS INTEGER);
        CONSUMO_LOCALIZACAO_DESCRICAO = TRIM(CAST(SUBSTRING(CONSUMO_DADOS FROM 21 FOR 100) AS VARCHAR(100)));

        IF ( TALAO_LOCALIZACAO_ID <> CONSUMO_LOCALIZACAO_ID ) THEN
        BEGIN

            EXCEPTION "..." 'LOCALIZACAO DE ESTOQUE DO TALAO A SER ALOCADO DIFERENTE DA LOCALIZACAO DO CONSUMO.' ||
                            ' LOCALIZACAO TALAO: ' || :TALAO_LOCALIZACAO_ID || ' - ' || :TALAO_LOCALIZACAO_DESCRICAO ||
                            ' LOCALIZACAO CONSUMO : ' || :CONSUMO_LOCALIZACAO_ID || ' - ' || :CONSUMO_LOCALIZACAO_DESCRICAO||
                            ' TIPO DE ALOCACAO : ' || NEW.TIPO||
                            ' ID DO TALAO A SER ALOCADO : ' || NEW.TABELA_ID;

        END   */
    END

    IF (NEW.CONSUMO_ID > 0 AND NEW.REMESSA_TALAO_DETALHE_ID > 0) THEN
    BEGIN
        EXCEPTION "..." 'ORIGEM DA ALOCACAO ESTA INVALIDA. OPERACAO CANCELADA. CONSUMO:'||coalesce(NEW.CONSUMO_ID,'0')||'  TALAO DETALHE:'||coalesce(NEW.REMESSA_TALAO_DETALHE_ID,'0')||' ' ||
        ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
    END

    IF (NEW.TIPO IS NULL OR
        NEW.TABELA_ID IS NULL OR
        NEW.PRODUTO_ID IS NULL) THEN
    BEGIN
        EXCEPTION "..." 'VINCULO DA ALOCACAO ESTA INVALIDO. OPERACAO CANCELADA. PRODUTO:'||coalesce(NEW.PRODUTO_ID,'NULL')||' TABELA:'||coalesce(NEW.TABELA_ID,'NULL')||' TIPO:'||coalesce(NEW.TIPO,'NULL')||' ' ||
        ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
    END
    
    IF ( NEW.QUANTIDADE <= 0 ) THEN
    BEGIN
        EXCEPTION "..." 'QUANTIDADE INVALIDA. OPERACAO CANCELADA. QUANTIDADE:'||coalesce(NEW.QUANTIDADE,'NULL')||' ' ||
        ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
    END

    UM_ALTERNATIVA = (SELECT CHAR_LENGTH(TRIM(F.UNIDADEMEDIDA_ALTERNATIVO2))
                        FROM TBPRODUTO P, TBFAMILIA F
                       WHERE F.CODIGO = P.FAMILIA_CODIGO
                         AND P.CODIGO = NEW.PRODUTO_ID);

    IF ( UM_ALTERNATIVA > 0 AND NEW.QUANTIDADE_ALTERNATIVA <= 0 ) THEN
    BEGIN
        
        PRODUTO_INVENTARIO =
        COALESCE((SELECT P.INVENTARIO
                    FROM TBPRODUTO P
                   WHERE P.CODIGO = NEW.PRODUTO_ID),'0');

        --CONSUMO_ALTERNATIVO = COALESCE((SELECT FIRST 1 X.QUANTIDADE_ALTERNATIVA FROM VWREMESSA_CONSUMO X WHERE ID = NEW.CONSUMO_ID),0);

        IF ( PRODUTO_INVENTARIO = '1' ) THEN
        BEGIN
            EXCEPTION "..." 'QUANTIDADE ALTERNATIVA E OBRIGATORIA PARA PRODUTOS DE INVENTARIO. OPERACAO CANCELADA. QUANTIDADE ALTERNATIVA:'||coalesce(NEW.QUANTIDADE_ALTERNATIVA,'0' || ' PRODUTO ID: ' || COALESCE(NEW.PRODUTO_ID,0) || ' CONSUMO ID: ' || COALESCE(NEW.CONSUMO_ID,0));
        END

    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_COPIA_MODELO_GERAL (
    ID1 integer,
    ID2 integer,
    DESCRICAO_1 varchar(50),
    USUARIO_ID integer)
returns (
    CODIGO integer,
    DESCRICAO varchar(50),
    FAMILIA_ALTERNATIVA integer,
    FAMILIA_CODIGO integer,
    GRADE_CODIGO integer,
    MATRIZ_CODIGO integer,
    STATUS char(1),
    LINHA_CODIGO integer,
    TIPOPRODUTO_CODIGO integer,
    CLASSIFICACAO varchar(10),
    UNIDADEMEDIDA_SIGLA varchar(3),
    MODELO_PAI integer,
    DENSIDADE integer,
    ESPESSURA numeric(10,1),
    TIPO_TAG varchar(10),
    ACRESCIMO numeric(15,2),
    PRIORIDADE integer,
    GERAR_REMESSA char(1),
    HORAS_BLOQUEIO integer,
    HORAS_TOLERANCIA integer,
    COR_ID integer,
    TAMANHO integer,
    T01 char(1),
    T02 char(1),
    T03 char(1),
    T04 char(1),
    T05 char(1),
    T06 char(1),
    T07 char(1),
    T08 char(1),
    T09 char(1),
    T10 char(1),
    T11 char(1),
    T12 char(1),
    T13 char(1),
    T14 char(1),
    T15 char(1),
    T16 char(1),
    T17 char(1),
    T18 char(1),
    T19 char(1),
    T20 char(1),
    OBSERVACAO blob sub_type 0 segment size 80)
as
BEGIN

FOR Select A.CODIGO, A.DESCRICAO, A.FAMILIA_ALTERNATIVA, A.FAMILIA_CODIGO,
    A.GRADE_CODIGO, A.MATRIZ_CODIGO, A.STATUS, A.LINHA_CODIGO, A.TIPOPRODUTO_CODIGO,
    A.T01, A.T02, A.T03, A.T04, A.T05, A.T06, A.T07, A.T08, A.T09, A.T10,
    A.T11, A.T12, A.T13, A.T14, A.T15, A.T16, A.T17, A.T18, A.T19, A.T20,
    (Select B.Observacao from TbModelo_Observacao B Where B.Modelo_Codigo = A.Codigo),
    CLASSIFICACAO, UNIDADEMEDIDA_SIGLA2, MODELO_PAI, DENSIDADE, ESPESSURA,
    TIPO_TAG, ACRESCIMO, PRIORIDADE, GERAR_REMESSA, HORAS_BLOQUEIO, HORAS_TOLERANCIA,
    COR_ID,TAMANHO
From TbModelo A
Left join TbModelo_Padrao P On P.Modelo_Id = A.Codigo
Where A.Codigo = :ID1

INTO :CODIGO, :DESCRICAO, :FAMILIA_ALTERNATIVA, :FAMILIA_CODIGO,
     :GRADE_CODIGO, :MATRIZ_CODIGO, :STATUS, :LINHA_CODIGO, :TIPOPRODUTO_CODIGO,
     :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10,
     :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20, :OBSERVACAO,
     :CLASSIFICACAO, :UNIDADEMEDIDA_SIGLA, :MODELO_PAI, :DENSIDADE, :ESPESSURA,
     :TIPO_TAG, :ACRESCIMO, :PRIORIDADE, :GERAR_REMESSA, :HORAS_BLOQUEIO,
     :HORAS_TOLERANCIA, :COR_ID, :TAMANHO

DO

    IF (:CODIGO > 0) then
         BEGIN

            UPDATE or INSERT INTO TBMODELO (
            CODIGO, DESCRICAO, FAMILIA_ALTERNATIVA, FAMILIA_CODIGO, GRADE_CODIGO,
            MATRIZ_CODIGO, STATUS, LINHA_CODIGO, TIPOPRODUTO_CODIGO,
            T01, T02, T03, T04, T05, T06, T07, T08, T09, T10,
            T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
            CLASSIFICACAO, UNIDADEMEDIDA_SIGLA2, MODELO_PAI, DENSIDADE,
            ESPESSURA, TIPO_TAG, ACRESCIMO, PRIORIDADE, GERAR_REMESSA,
            HORAS_BLOQUEIO, HORAS_TOLERANCIA, USUARIO_CODIGO) VALUES (
           :ID2, :DESCRICAO_1, :FAMILIA_ALTERNATIVA, :FAMILIA_CODIGO, :GRADE_CODIGO,
           :MATRIZ_CODIGO, :STATUS, :LINHA_CODIGO, :TIPOPRODUTO_CODIGO,
           :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10,
           :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20,
           :CLASSIFICACAO, :UNIDADEMEDIDA_SIGLA, :MODELO_PAI, :DENSIDADE,
           :ESPESSURA, :TIPO_TAG, :ACRESCIMO, :PRIORIDADE, :GERAR_REMESSA,
           :HORAS_BLOQUEIO, :HORAS_TOLERANCIA, :USUARIO_ID)
            MATCHING (CODIGO);
    
         UPDATE or INSERT
         INTO TBMODELO_OBSERVACAO (MODELO_CODIGO, OBSERVACAO)
         VALUES (:ID2, :OBSERVACAO) MATCHING (MODELO_CODIGO);

         if (:COR_ID > 0 and :TAMANHO > 0) then
            Begin
             UPDATE or INSERT
             INTO TBMODELO_PADRAO (MODELO_ID, COR_ID, TAMANHO)
             VALUES (:ID2, :COR_ID, :TAMANHO) MATCHING (MODELO_ID);
            End

         END

SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttmodelo_b1u_01 for tbmodelo
inactive before update position 1
AS
DECLARE VARIABLE MASCARA1 VARCHAR(500);
DECLARE VARIABLE MASCARA2 VARCHAR(500);
DECLARE VARIABLE Cor_Id Integer;
DECLARE VARIABLE Cor_Descricao VARCHAR(50);
DECLARE VARIABLE Familia_Descricao VARCHAR(50);
Begin

   --Verifica se familia ou descrição do modelo foi alterada
   if (OLD.familia_codigo <> NEW.familia_codigo or
       OLD.familia_alternativa <> NEW.familia_alternativa or
       OLD.descricao <> NEW.descricao) then
       BEGIN

       Mascara1 = Coalesce((Select First 1 F.Mascara_Produto From TbFamilia F Where F.Codigo = New.Familia_Codigo),'');

       --Se o campo <Mascara> está definido no cadastro da família executa esse bloco de instruções
       if (Trim(:Mascara1) <> '') then
           Begin
           FAMILIA_DESCRICAO = Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = New.Familia_Alternativa),'');
           --Abre cadastro de cores do modelo e atualiza os produtos por cor de modelo
           For Select MC.COR_ID, C.DESCRICAO
                 From TbModelo_Cor MC, TbCor C
                Where MC.Modelo_Id = New.Codigo
                  and MC.Cor_Id = C.Codigo
           Into :Cor_Id, :Cor_Descricao
           Do
             Begin
               if (:Cor_Id > 0) then
                   Begin
                    Mascara2 = :Mascara1;
                    Mascara2 = Replace(:Mascara2,'#FAMILIA_ID',fn_lPad(New.Familia_Alternativa,4,'0'));
                    Mascara2 = Replace(:Mascara2,'#FAMILIA_DESCRICAO',:Familia_Descricao);
                    Mascara2 = Replace(:Mascara2,'#MODELO_ID',fn_lPad(New.Codigo,4,'0'));
                    Mascara2 = Replace(:Mascara2,'#MODELO_DESCRICAO',New.Descricao);
                    Mascara2 = Replace(:Mascara2,'#COR_ID',fn_lPad(:Cor_Id,4,'0'));
                    Mascara2 = Replace(:Mascara2,'#COR_DESCRICAO',:Cor_Descricao);
                
                    Update TbProduto Set
                    tipoproduto_codigo = NEW.tipoproduto_codigo,
                    familia_codigo = NEW.familia_codigo,
                    familia_alternativa = NEW.familia_alternativa,
                    linha_codigo = NEW.linha_codigo,
                    unidademedida_sigla2 = NEW.unidademedida_sigla2,
                    descricao = :Mascara2,
                    grade_codigo = NEW.grade_codigo
                    Where Modelo_Codigo = New.Codigo
                      and Cor_Codigo = :Cor_Id;
                   End
             End
           End else
           Begin
           --Se o campo <Mascara> não estiver definido no cadastro da família executa esse bloco de instruções
           if (OLD.familia_codigo <> NEW.familia_codigo  or
               OLD.familia_alternativa <> NEW.familia_alternativa) Then
               Begin
                   Update TbProduto Set
                   tipoproduto_codigo = NEW.tipoproduto_codigo,
                   familia_codigo = NEW.familia_codigo,
                   familia_alternativa = NEW.familia_alternativa,
                   linha_codigo = NEW.linha_codigo,
                   unidademedida_sigla2 = NEW.unidademedida_sigla2,
                   grade_codigo = NEW.grade_codigo
                   Where Modelo_Codigo = New.Codigo;
               End
           End
       End else
   --Se alteração no modelo for nos campos Tipo,Linha,Und ou Grade executa esse bloco de instruções
   if (OLD.tipoproduto_codigo <> NEW.tipoproduto_codigo or
       OLD.linha_codigo <> NEW.linha_codigo or
       OLD.unidademedida_sigla2 <> NEW.unidademedida_sigla2 or
       OLD.grade_codigo <> NEW.grade_codigo) then
       BEGIN
           Update TbProduto Set
           tipoproduto_codigo = NEW.tipoproduto_codigo,
           linha_codigo = NEW.linha_codigo,
           unidademedida_sigla2 = NEW.unidademedida_sigla2,
           grade_codigo = NEW.grade_codigo 
           Where Modelo_Codigo = New.Codigo;
       END

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttmodelo_b9u for tbmodelo
inactive before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.tipoproduto_codigo <> NEW.tipoproduto_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Tipo '||OLD.tipoproduto_codigo||'->'||NEW.tipoproduto_codigo;
       END
   if (OLD.familia_codigo <> NEW.familia_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Fam.Prd.'||OLD.familia_codigo||'->'||NEW.familia_codigo;
       END
   if (OLD.familia_alternativa <> NEW.familia_alternativa) then
       BEGIN
       HISTORICO = HISTORICO||' Fam.Com.'||OLD.familia_alternativa||'->'||NEW.familia_alternativa;
       END
   if (OLD.linha_codigo <> NEW.linha_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Lin.'||OLD.linha_codigo||'->'||NEW.linha_codigo;
       END
   if (OLD.unidademedida_sigla2 <> NEW.unidademedida_sigla2) then
       BEGIN
       HISTORICO = HISTORICO||' UM.'||OLD.unidademedida_sigla2||'->'||NEW.unidademedida_sigla2;
       END
   if (OLD.descricao <> NEW.descricao) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.'||OLD.descricao||'->'||NEW.descricao;
       END
   if (OLD.descricao_nf <> NEW.descricao_nf) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.Cpl.'||OLD.descricao_nf||'->'||NEW.descricao_nf;
       END
       
   if (OLD.descricao_comercial <> NEW.descricao_comercial) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.Com.'||OLD.descricao_comercial||'->'||NEW.descricao_comercial;
       END
   if (OLD.matriz_codigo <> NEW.matriz_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Mtz.'||OLD.matriz_codigo||'->'||NEW.matriz_codigo;
       END
   if (OLD.grade_codigo <> NEW.grade_codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Grd.'||OLD.grade_codigo||'->'||NEW.grade_codigo;
       END
   if (OLD.classificacao <> NEW.classificacao) then
       BEGIN
       HISTORICO = HISTORICO||' Class.'||OLD.classificacao||'->'||NEW.classificacao;
       END
   if (OLD.compra_produz <> NEW.compra_produz) then
       BEGIN
       HISTORICO = HISTORICO||' Form.Entr.Est.'||OLD.compra_produz||'->'||NEW.compra_produz;
       END
   if (OLD.Densidade <> NEW.Densidade) then
       BEGIN
       HISTORICO = HISTORICO||' Dens.'||OLD.Densidade||'->'||NEW.Densidade;
       END
   if (OLD.Espessura<> NEW.Espessura) then
       BEGIN
       HISTORICO = HISTORICO||' Esp.'||OLD.Espessura||'->'||NEW.Espessura;
       END
   if (OLD.Tipo_Tag <> NEW.Tipo_Tag) then
       BEGIN
       HISTORICO = HISTORICO||' Tp.Tag '||OLD.Tipo_Tag||'->'||NEW.Tipo_Tag;
       END
   if (OLD.Acrescimo <> NEW.Acrescimo) then
       BEGIN
       HISTORICO = HISTORICO||' Acresc.'||OLD.Acrescimo||'->'||NEW.Acrescimo;
       END
   if (OLD.Prioridade <> NEW.Prioridade) then
       BEGIN
       HISTORICO = HISTORICO||' Prior.Prod.'||OLD.Prioridade||'->'||NEW.Prioridade;
       END
   if (OLD.Horas_Bloqueio <> NEW.Horas_Bloqueio) then
       BEGIN
       HISTORICO = HISTORICO||' Hr.Blq.'||OLD.Horas_Bloqueio||'->'||NEW.Horas_Bloqueio;
       END
   if (OLD.Gerar_Remessa <> NEW.Gerar_Remessa) then
       BEGIN
       HISTORICO = HISTORICO||' Hab.Ger.Rem.'||OLD.Gerar_Remessa||'->'||NEW.Gerar_Remessa;
       END 
   if (OLD.habilita_ecommerce <> NEW.habilita_ecommerce) then
       BEGIN
       HISTORICO = HISTORICO||' Hab.Ecom.'||OLD.habilita_ecommerce||'->'||NEW.habilita_ecommerce;
       END
   if (OLD.CATEGORIA_ID <> NEW.CATEGORIA_ID) then
       BEGIN
       HISTORICO = HISTORICO||' Cat:'||OLD.CATEGORIA_ID||'->'||NEW.CATEGORIA_ID;
       END
   if (OLD.Modelo_Pai <> NEW.Modelo_Pai) then
       BEGIN
       HISTORICO = HISTORICO||' Modelo Pai:'||OLD.Modelo_Pai||'->'||NEW.Modelo_Pai;
       END

   if (OLD.t01 <> NEW.t01) then BEGIN HISTORICO = HISTORICO||' T01 '||OLD.t01||'->'||NEW.t01; END
   if (OLD.t02 <> NEW.t02) then BEGIN HISTORICO = HISTORICO||' T02 '||OLD.t02||'->'||NEW.t02; END
   if (OLD.t03 <> NEW.t03) then BEGIN HISTORICO = HISTORICO||' T03 '||OLD.t03||'->'||NEW.t03; END
   if (OLD.t04 <> NEW.t04) then BEGIN HISTORICO = HISTORICO||' T04 '||OLD.t04||'->'||NEW.t04; END
   if (OLD.t05 <> NEW.t05) then BEGIN HISTORICO = HISTORICO||' T05 '||OLD.t05||'->'||NEW.t05; END
   if (OLD.t06 <> NEW.t06) then BEGIN HISTORICO = HISTORICO||' T06 '||OLD.t06||'->'||NEW.t06; END
   if (OLD.t07 <> NEW.t07) then BEGIN HISTORICO = HISTORICO||' T07 '||OLD.t07||'->'||NEW.t07; END
   if (OLD.t08 <> NEW.t08) then BEGIN HISTORICO = HISTORICO||' T08 '||OLD.t08||'->'||NEW.t08; END
   if (OLD.t09 <> NEW.t09) then BEGIN HISTORICO = HISTORICO||' T09 '||OLD.t09||'->'||NEW.t09; END
   if (OLD.t10 <> NEW.t10) then BEGIN HISTORICO = HISTORICO||' T10 '||OLD.t10||'->'||NEW.t10; END
   if (OLD.t11 <> NEW.t11) then BEGIN HISTORICO = HISTORICO||' T11 '||OLD.t11||'->'||NEW.t11; END
   if (OLD.t12 <> NEW.t12) then BEGIN HISTORICO = HISTORICO||' T12 '||OLD.t12||'->'||NEW.t12; END
   if (OLD.t13 <> NEW.t13) then BEGIN HISTORICO = HISTORICO||' T13 '||OLD.t13||'->'||NEW.t13; END
   if (OLD.t14 <> NEW.t14) then BEGIN HISTORICO = HISTORICO||' T14 '||OLD.t14||'->'||NEW.t14; END
   if (OLD.t15 <> NEW.t15) then BEGIN HISTORICO = HISTORICO||' T15 '||OLD.t15||'->'||NEW.t15; END
   if (OLD.t16 <> NEW.t16) then BEGIN HISTORICO = HISTORICO||' T16 '||OLD.t16||'->'||NEW.t16; END
   if (OLD.t17 <> NEW.t17) then BEGIN HISTORICO = HISTORICO||' T17 '||OLD.t17||'->'||NEW.t17; END
   if (OLD.t18 <> NEW.t18) then BEGIN HISTORICO = HISTORICO||' T18 '||OLD.t18||'->'||NEW.t18; END
   if (OLD.t19 <> NEW.t19) then BEGIN HISTORICO = HISTORICO||' T19 '||OLD.t19||'->'||NEW.t19; END
   if (OLD.t11 <> NEW.t20) then BEGIN HISTORICO = HISTORICO||' T20 '||OLD.t20||'->'||NEW.t20; END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           begin
           HISTORICO = HISTORICO||' Status Inativado';
           new.data_inativacao = CURRENT_DATE;
           end
       if (NEW.STATUS = '1') then
           begin
           HISTORICO = HISTORICO||' Status Ativado';
           new.data_ativacao = CURRENT_DATE;
           end
       END

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBMODELO', OLD.CODIGO,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End
end
^

SET TERM ; ^

CREATE OR ALTER VIEW VWESTOQUE_SALDO_DISPONIVEL(
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    FAMILIA_ID,
    PRODUTO_ID,
    PRODUTO_DESCRICAO,
    GRADE_ID,
    TAMANHO,
    TAMANHO_DESCRICAO,
    SALDO,
    UM,
    FILTRO)
AS
SELECT
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    FAMILIA_ID, 
    PRODUTO_ID,
    DESCRICAO PRODUTO_DESCRICAO,
    GRADE_ID,
    TAMANHO,
    TAMANHO_DESCRICAO,
    SALDO,
    UNIDADEMEDIDA_SIGLA2 UM,
    FN_LPAD(PRODUTO_ID,6,0) || ' - ' || DESCRICAO || ' - ' || TAMANHO_DESCRICAO FILTRO
FROM (
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 00 TAMANHO,                                  '' TAMANHO_DESCRICAO, (A.SALDO    - COALESCE((SELECT SUM(EA.QUANTIDADE) FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO),0)) SALDO             , P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.SALDO     > 0 AND P.GRADE_CODIGO = 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 01 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,01) TAMANHO_DESCRICAO, A.T01_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 01),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T01_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 02 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,02) TAMANHO_DESCRICAO, A.T02_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 02),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T02_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 03 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,03) TAMANHO_DESCRICAO, A.T03_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 03),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T03_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 04 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,04) TAMANHO_DESCRICAO, A.T04_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 04),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T04_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 05 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,05) TAMANHO_DESCRICAO, A.T05_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 05),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T05_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 06 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,06) TAMANHO_DESCRICAO, A.T06_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 06),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T06_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 07 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,07) TAMANHO_DESCRICAO, A.T07_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 07),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T07_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 08 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,08) TAMANHO_DESCRICAO, A.T08_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 08),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T08_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 09 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,09) TAMANHO_DESCRICAO, A.T09_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 09),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T09_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 10 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,10) TAMANHO_DESCRICAO, A.T10_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 10),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T10_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 11 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,11) TAMANHO_DESCRICAO, A.T11_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 11),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T11_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 12 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,12) TAMANHO_DESCRICAO, A.T12_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 12),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T12_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 13 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,13) TAMANHO_DESCRICAO, A.T13_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 13),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T13_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 14 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,14) TAMANHO_DESCRICAO, A.T14_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 14),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T14_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 15 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,15) TAMANHO_DESCRICAO, A.T15_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 15),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T15_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 16 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,16) TAMANHO_DESCRICAO, A.T16_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 16),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T16_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 17 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,17) TAMANHO_DESCRICAO, A.T17_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 17),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T17_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 18 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,18) TAMANHO_DESCRICAO, A.T18_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 18),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T18_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 19 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,19) TAMANHO_DESCRICAO, A.T19_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 19),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T19_SALDO > 0 AND P.GRADE_CODIGO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 20 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,20) TAMANHO_DESCRICAO, A.T20_SALDO - COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 20),0), P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A LEFT JOIN TBPRODUTO P ON P.CODIGO = A.PRODUTO_CODIGO AND P.LOCALIZACAO_CODIGO = A.LOCALIZACAO_CODIGO WHERE A.T20_SALDO > 0 AND P.GRADE_CODIGO > 0
) WHERE SALDO > 0
;

CREATE OR ALTER VIEW VWESTOQUE_SALDO_PRODUTO(
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    PRODUTO_ID,
    FAMILIA_ID,
    DESCRICAO,
    GRADE_ID,
    TAMANHO,
    TAMANHO_DESCRICAO,
    SALDO,
    UM)
AS
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 00 TAMANHO,                                  '' TAMANHO_DESCRICAO,     A.SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO = 0 AND     A.SALDO > 0 UNION

SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 01 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,01) TAMANHO_DESCRICAO, A.T01_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T01_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 02 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,02) TAMANHO_DESCRICAO, A.T02_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T02_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 03 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,03) TAMANHO_DESCRICAO, A.T03_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T03_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 04 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,04) TAMANHO_DESCRICAO, A.T04_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T04_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 05 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,05) TAMANHO_DESCRICAO, A.T05_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T05_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 06 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,06) TAMANHO_DESCRICAO, A.T06_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T06_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 07 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,07) TAMANHO_DESCRICAO, A.T07_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T07_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 08 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,08) TAMANHO_DESCRICAO, A.T08_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T08_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 09 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,09) TAMANHO_DESCRICAO, A.T09_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T09_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 10 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,10) TAMANHO_DESCRICAO, A.T10_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T10_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 11 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,11) TAMANHO_DESCRICAO, A.T11_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T11_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 12 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,12) TAMANHO_DESCRICAO, A.T12_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T12_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 13 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,13) TAMANHO_DESCRICAO, A.T13_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T13_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 14 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,14) TAMANHO_DESCRICAO, A.T14_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T14_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 15 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,15) TAMANHO_DESCRICAO, A.T15_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T15_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 16 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,16) TAMANHO_DESCRICAO, A.T16_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T16_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 17 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,17) TAMANHO_DESCRICAO, A.T17_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T17_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 18 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,18) TAMANHO_DESCRICAO, A.T18_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T18_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 19 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,19) TAMANHO_DESCRICAO, A.T19_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T19_SALDO > 0 UNION
SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID, A.LOCALIZACAO_CODIGO LOCALIZACAO_ID, A.PRODUTO_CODIGO PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 20 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,20) TAMANHO_DESCRICAO, A.T20_SALDO, P.UNIDADEMEDIDA_SIGLA2 FROM TBESTOQUE_SALDO A, TBPRODUTO P WHERE P.CODIGO = A.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND A.T20_SALDO > 0
;

CREATE OR ALTER VIEW VWESTOQUE_SALDO_PRODUTO2(
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    FAMILIA_ID,
    PRODUTO_ID,
    PRODUTO_DESCRICAO,
    GRADE_ID,
    TAMANHO,
    TAMANHO_DESCRICAO,
    ALOCADO,
    SALDO,
    UM,
    FILTRO,
    SALDO_DETERCEIRO,
    SALDO_EMTERCEIRO)
AS
SELECT
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    FAMILIA_ID, 
    PRODUTO_ID,
    DESCRICAO PRODUTO_DESCRICAO,
    GRADE_ID,
    TAMANHO,
    TAMANHO_DESCRICAO,
    ALOCADO,
    coalesce(SALDO,0),
    UNIDADEMEDIDA_SIGLA2 UM,
    FN_LPAD(PRODUTO_ID,6,0) || ' - ' || DESCRICAO || ' - ' || TAMANHO_DESCRICAO FILTRO,
    coalesce(saldo_deterceiro,0),
    coalesce(saldo_emterceiro,0)

FROM (
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 00 TAMANHO,                                  '' TAMANHO_DESCRICAO, COALESCE((SELECT SUM(EA.QUANTIDADE) FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO),0) as ALOCADO,                          (A.SALDO) SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO = 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 01 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,01) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 01),0) as ALOCADO, A.T01_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
SELECT coalesce(A.ESTABELECIMENTO_CODIGO,1) ESTABELECIMENTO_ID, coalesce(A.LOCALIZACAO_CODIGO,p.localizacao_codigo) LOCALIZACAO_ID, p.codigo as PRODUTO_ID, P.FAMILIA_CODIGO FAMILIA_ID, P.DESCRICAO, P.GRADE_CODIGO GRADE_ID, 02 TAMANHO, FN_TAMANHO_GRADE(P.GRADE_CODIGO,02) TAMANHO_DESCRICAO, COALESCE((SELECT EA.QUANTIDADE      FROM TBESTOQUE_SALDO_ALOCACAO EA WHERE EA.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO AND EA.LOCALIZACAO_ID = A.LOCALIZACAO_CODIGO AND EA.PRODUTO_ID = A.PRODUTO_CODIGO AND EA.TAMANHO = 02),0) as ALOCADO, A.T02_SALDO as SALDO, P.UNIDADEMEDIDA_SIGLA2, a.saldo_deterceiro, a.saldo_emterceiro FROM TBPRODUTO P LEFT JOIN TBESTOQUE_SALDO A ON P.CODIGO = A.PRODUTO_CODIGO WHERE P.GRADE_CODIGO > 0 and P.STATUS = '1'  UNION
