/****************************************************************************/
/****************************************************************************/
/**** UNIDADEMEDIDA_SIGLA ***************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SPC_AMOSTRA_INVENTARIO (
    REGISTROS integer,
    LOC integer,
    FAM varchar(40))
returns (
    SEQ integer,
    DATAHORA timestamp,
    FAMILIA varchar(30),
    PRODUTO varchar(110),
    SALDO numeric(18,5),
    UM varchar(10),
    INVENTARIO varchar(1),
    PRODUTO_ID integer,
    LOCALIZACAO varchar(40))
as
declare variable I integer;
BEGIN

i = 0;
UPDATE TBPRODUTO SET DATA_AMOSTRA_INVENTARIO = NULL WHERE DATA_AMOSTRA_INVENTARIO = CURRENT_DATE AND FAMILIA_CODIGO = :FAM;

FOR SELECT
    DATAHORA, FAMILIA, PRODUTO, SALDO, UM, INVENTARIO, PRODUTO_ID,
    LOCALIZACAO_ID||'-'||(SELECT DESCRICAO FROM TBLOCALIZACAO WHERE CODIGO = LOCALIZACAO_ID) LOCALIZACAO
    FROM (
    SELECT FIRST 50 DISTINCT
            CURRENT_TIMESTAMP DATAHORA,
            FN_LPAD(F.CODIGO,4,'0')||' - '||F.DESCRICAO FAMILIA,
            FN_LPAD(P.CODIGO,6,'0')||' - '||P.DESCRICAO PRODUTO, E.SALDO,
            P.UNIDADEMEDIDA_SIGLA UM,
            '' INVENTARIO,
            IIF( CHAR_LENGTH( CAST(:LOC AS INTEGER) ) > 0, :LOC , P.LOCALIZACAO_CODIGO ) LOCALIZACAO_ID, P.CODIGO PRODUTO_ID
       FROM TBPRODUTO P, TBESTOQUE_SALDO E, TBESTOQUE_SALDO_DIARIO ES, TBFAMILIA F
      WHERE E.PRODUTO_CODIGO = P.CODIGO
        AND E.ESTABELECIMENTO_CODIGO = ES.ESTABELECIMENTO_CODIGO
        AND E.LOCALIZACAO_CODIGO = ES.LOCALIZACAO_CODIGO
        AND E.PRODUTO_CODIGO = ES.PRODUTO_CODIGO
        AND P.FAMILIA_CODIGO = F.CODIGO
        AND E.ESTABELECIMENTO_CODIGO = 1
        AND E.LOCALIZACAO_CODIGO = IIF( CHAR_LENGTH( CAST(:LOC AS INTEGER) ) > 0, CAST(:LOC AS INTEGER) , P.LOCALIZACAO_CODIGO )
        AND ES.DATA >= CURRENT_DATE - 90
        AND E.SALDO > 0
        AND F.INVENTARIO = '1'
        AND F.STATUS = '1'
        AND F.CODIGO||F.DESCRICAO CONTAINING UPPER( :FAM )
        AND (COALESCE(P.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE)) = CURRENT_DATE or
             COALESCE(P.DATA_AMOSTRA_INVENTARIO,CAST('01.01.2000' as DATE)) < CURRENT_DATE - 30)

    ORDER BY RAND())
    ORDER BY 2,3

INTO
:DATAHORA,
:FAMILIA,
:PRODUTO,
:SALDO,
:UM,
:INVENTARIO,
:PRODUTO_ID,
:LOCALIZACAO
DO BEGIN
   if (:Registros > i) then
       Begin
           i = i + 1;
           SEQ = I;
           UPDATE TBPRODUTO SET DATA_AMOSTRA_INVENTARIO = CURRENT_DATE WHERE CODIGO = :PRODUTO_ID;
           SUSPEND;
       End
   END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO_INVENTARIO (
    VQTD integer,
    VMES integer,
    VANO integer)
returns (
    ANO integer,
    MES integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    UM varchar(10),
    SALDO_FISICO numeric(18,4),
    SALDO_EMTERCEIRO numeric(18,4),
    CUSTO_MEDIO numeric(18,4),
    DESPESA numeric(18,8),
    MODELO_ID integer,
    FAMILIA_ID integer,
    COR_ID integer,
    TAMANHO integer,
    FATOR_SETUP integer,
    DEFEITOS numeric(18,8),
    PRODUZIDO numeric(18,8),
    CUSTO_MEDIO_P numeric(18,8),
    C_P numeric(18,8),
    CUSTO_P numeric(18,8),
    ICMS_P numeric(18,8))
as
declare variable MODELO_DESCRICAO varchar(100);
declare variable COR_DESCRICAO varchar(100);
declare variable TAMANHO_DESCRICAO varchar(20);
declare variable PRODUTO_CONSUMO integer;
declare variable TAMANHO_CONSUMO integer;
declare variable ORIGEM integer;
declare variable TS numeric(18,8);
declare variable "TO" numeric(18,8);
declare variable CMS numeric(18,8);
declare variable CMO numeric(18,8);
declare variable CMOIP numeric(18,8);
declare variable CMOIA numeric(18,8);
declare variable CSMOIP numeric(18,8);
declare variable CSMOIA numeric(18,8);
declare variable PERDA numeric(18,8);
declare variable CONSUMO numeric(18,8);
declare variable C numeric(18,8);
declare variable T numeric(18,8);
declare variable CS numeric(18,8);
declare variable CO numeric(18,8);
declare variable COIP numeric(18,8);
declare variable COIA numeric(18,8);
declare variable CSIP numeric(18,8);
declare variable CSIA numeric(18,8);
declare variable FATOR_CONVERSAO numeric(18,8);
declare variable CUSTO_MINUTO numeric(18,8);
declare variable MOI_PROPRIO numeric(18,8);
declare variable MOI_ABSORVIDO numeric(18,8);
declare variable DATA date;
declare variable CUSTO numeric(18,8);
declare variable DOLAR numeric(18,8);
declare variable MARGEM numeric(18,4);
declare variable OPERACIONAL numeric(18,8);
declare variable INDIRETO numeric(18,8);
declare variable NIVEL integer;
declare variable FLAG integer;
declare variable FLAG_TAMANHO integer;
declare variable H_ORIGEM varchar(200);
declare variable ICMS numeric(18,8);
BEGIN

    FOR
        select
            FAMILIA_CODIGO,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            UM,
            SALDO_FISICO,
            SALDO_EM_TERCEIRO,
            CUSTO_MEDIO,
            MODELO_CODIGO,
            COR
        from(
            SELECT
                b.familia_codigo,
                A.PRODUTO_CODIGO PRODUTO_ID,
                B.DESCRICAO PRODUTO_DESCRICAO,
                B.UNIDADEMEDIDA_SIGLA UM,
                CAST(A.SALDO AS NUMERIC(18,4)) SALDO_FISICO,
                CAST(A.SALDO_EMTERCEIRO AS NUMERIC(18,4)) SALDO_EM_TERCEIRO,
                CAST(A.CUSTO_MEDIO AS NUMERIC(18,4)) CUSTO_MEDIO,
                b.modelo_codigo,
                p.id as ID_CUSTO,
                b.cor_codigo as COR
            FROM TBPRODUTO B, TBESTOQUE_SALDO_MES A
            left join tbcusto_produto p on p.produto_id = a.produto_codigo and p.ano = a.ano and p.mes = a.mes
            WHERE A.PRODUTO_CODIGO = B.CODIGO
              AND B.FAMILIA_CODIGO IN (3,133)
              AND A.SALDO + A.SALDO_EMTERCEIRO > 0
              AND a.ANO = :VANO
              AND a.MES = :VMES
        ) where ID_CUSTO is null
    INTO :FAMILIA_ID,
         :PRODUTO_ID,
         :PRODUTO_DESCRICAO,
         :UM,
         :SALDO_FISICO,
         :SALDO_EMTERCEIRO,
         :CUSTO_MEDIO,
         :MODELO_ID,
         :COR_ID
    DO BEGIN

        :FATOR_SETUP = coalesce((select first 1 RC.fator_setup FROM tbregra_calculo_custo RC WHERE RC.familia_producao = :FAMILIA_ID AND RC.familia_id = RC.familia_producao),1);

        for
            select v.tamanho from VWSKU v where v.modelo_id = :MODELO_ID and v.cor_id = :COR_ID
        into
            :TAMANHO
        do begin

            for
                select first 1
                    ANO,
                    MES,
                    NIVEL,
                    PRODUTO_DESCRICAO,
                    PRODUTO_CONSUMO,
                    TAMANHO_CONSUMO,
                    ORIGEM,
                    TS,
                    "TO",
                    CMS,
                    CMO,
                    CMOIP,
                    CMOIA,
                    CSMOIP,
                    CSMOIA,
                    PERDA,
                    CONSUMO,
                    C,
                    T,
                    CS,
                    CO,
                    COIP,
                    COIA,
                    CSIP,
                    CSIA,
                    CUSTO_MEDIO,
                    FATOR_CONVERSAO,
                    TAMANHO,
                    FLAG,
                    CUSTO_MINUTO,
                    MOI_PROPRIO,
                    MOI_ABSORVIDO,
                    FLAG_TAMANHO,
                    H_ORIGEM,
                    DATA,
                    CUSTO,
                    DOLAR,
                    MARGEM,
                    OPERACIONAL,
                    INDIRETO,
                    ICMS,
                    DEFEITOS,
                    PRODUZIDO,
                    CUSTO_MEDIO_P,
                    C_P,
                    CUSTO_P,
                    ICMS_P
                from SPC_CALCULAR_ABSORVIDO(:VANO,:VMES,:PRODUTO_ID,:tamanho, :FATOR_SETUP)
    
                where NIVEL = -1
            into
                ANO,
                MES,
                NIVEL,
                PRODUTO_DESCRICAO,
                PRODUTO_CONSUMO,
                TAMANHO_CONSUMO,
                ORIGEM,
                TS,
                "TO",
                CMS,
                CMO,
                CMOIP,
                CMOIA,
                CSMOIP,
                CSMOIA,
                PERDA,
                CONSUMO,
                C,
                T,
                CS,
                CO,
                COIP,
                COIA,
                CSIP,
                CSIA,
                CUSTO_MEDIO,
                FATOR_CONVERSAO,
                TAMANHO,
                FLAG,
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                FLAG_TAMANHO,
                H_ORIGEM,
                DATA,
                CUSTO,
                DOLAR,
                MARGEM,
                OPERACIONAL,
                INDIRETO,
                ICMS,
                DEFEITOS,
                PRODUZIDO,
                CUSTO_MEDIO_P,
                C_P,
                CUSTO_P,
                ICMS_P
            do begin
                in autonomous transaction
                do begin
                    UPDATE OR INSERT INTO TBCUSTO_PRODUTO (PRODUTO_ID, ANO, MES, NIVEL, PRODUTO_DESCRICAO, PRODUTO_CONSUMO, TAMANHO_CONSUMO, ORIGEM, TS, "TO", CMS, CMO, CMOIP, CMOIA, CSMOIP, CSMOIA, PERDA, C, T, CS, CO, CUSTO_MEDIO, FATOR_CONVERSAO, TAMANHO, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO, COIP, COIA, CSIP, CSIA, CONSUMO, FLAG_TAMANHO, DATA, CUSTO, DOLAR, MARGEM,OPERACIONAL,INDIRETO, ICMS, DEFEITOS, PRODUZIDO, CUSTO_MEDIO_P, C_P, CUSTO_P, ICMS_P)
                        VALUES (:PRODUTO_ID, :ANO, :MES, :NIVEL, :PRODUTO_DESCRICAO, :PRODUTO_CONSUMO, :TAMANHO_CONSUMO, :ORIGEM, :TS, :"TO", :CMS, :CMO, :CMOIP, :CMOIA, :CSMOIP, :CSMOIA, :PERDA, :C, :T, :CS, :CO, :CUSTO_MEDIO, :FATOR_CONVERSAO, :TAMANHO, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO, :COIP, :COIA, :CSIP, :CSIA, :CONSUMO, :FLAG_TAMANHO, :DATA, :CUSTO, :DOLAR, :MARGEM, :OPERACIONAL, :INDIRETO, :ICMS, :DEFEITOS, :PRODUZIDO, :CUSTO_MEDIO_P, :C_P, :CUSTO_P, :ICMS_P)
                    MATCHING (PRODUTO_ID, ANO, MES, TAMANHO);
                end
            end
    
            suspend;
        end

        suspend;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_CUSTO_PRODUTO_INVENTARIO (
    VQTD integer,
    VMES integer,
    VANO integer,
    VPROD1 integer,
    VPROD2 integer,
    FATOR_DESPESA numeric(15,1),
    FATOR_PERDA numeric(15,1),
    FATOR_CUSTO_MP numeric(15,1),
    FATOR_CUSTO_MO numeric(15,1))
returns (
    ANO integer,
    MES integer,
    ESTABELECIMENTO_ID integer,
    ESTABELECIMENTO_NOMEFANTASIA varchar(50),
    LOCALIZACAO_ID integer,
    LOCALIZACAO_DESCRICAO varchar(50),
    TIPOPRODUTO_ID integer,
    TIPOPRODUTO_DESCRICAO varchar(50),
    FAMILIA_ID integer,
    FAMILIA_DESCRICAO varchar(50),
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    UM varchar(10),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(20),
    SALDO_FISICO numeric(18,4),
    SALDO_EMTERCEIRO numeric(18,4),
    CUSTO_MEDIO numeric(18,4),
    CUSTO_TOTAL numeric(18,2),
    CUSTO_MP numeric(18,4),
    CUSTO_MO numeric(18,4),
    CUSTO_MP_MO numeric(18,4),
    CUSTO_MP_TOTAL numeric(18,4),
    CUSTO_MO_TOTAL numeric(18,4),
    CUSTO_MP_MO_TOTAL numeric(18,4),
    CMP numeric(18,8),
    CS numeric(18,8),
    CO numeric(18,8),
    CMO numeric(18,8),
    CIP numeric(18,8),
    CIA numeric(18,8),
    CD numeric(18,8),
    CI numeric(18,8),
    CT numeric(18,8),
    PERDA numeric(18,8),
    DESPESA numeric(18,8))
as
BEGIN

FOR SELECT
    A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,(SELECT FIRST 1 E.NOMEFANTASIA FROM TBESTABELECIMENTO E WHERE A.ESTABELECIMENTO_CODIGO = E.CODIGO) ESTABELECIMENTO_NOMEFANTASIA,
    A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,        (SELECT FIRST 1 L.DESCRICAO FROM TBLOCALIZACAO L WHERE A.LOCALIZACAO_CODIGO = L.CODIGO) LOCALIZACAO_DESCRICAO,
    B.TIPOPRODUTO_CODIGO TIPO_ID,               (SELECT FIRST 1 T.DESCRICAO FROM TBTIPOPRODUTO T WHERE B.TIPOPRODUTO_CODIGO = T.CODIGO) TIPO_DESCRICAO,
    B.FAMILIA_INVENTARIO FAMILIA_ID,                (SELECT FIRST 1 F.DESCRICAO FROM TBFAMILIA F WHERE B.FAMILIA_INVENTARIO = F.CODIGO) FAMILIA_DESCRICAO,
    A.PRODUTO_CODIGO PRODUTO_ID, B.DESCRICAO PRODUTO_DESCRICAO, B.UNIDADEMEDIDA_SIGLA UM,
    CAST(A.SALDO AS NUMERIC(18,4)) SALDO_FISICO,
    CAST(A.SALDO_EMTERCEIRO AS NUMERIC(18,4)) SALDO_EM_TERCEIRO,
    CAST(A.CUSTO_MEDIO AS NUMERIC(18,4)) CUSTO_MEDIO

FROM TBPRODUTO B, TBESTOQUE_SALDO_MES A
WHERE A.PRODUTO_CODIGO = B.CODIGO
  AND B.FAMILIA_INVENTARIO = 174 -- IN (3,58,47,133,160,157)
  AND A.SALDO + A.SALDO_EMTERCEIRO > 0
  AND ANO = :VANO
  AND MES = :VMES
  AND A.PRODUTO_CODIGO between :vPROD1 AND :vPROD2
order by a.estabelecimento_codigo, b.familia_inventario, a.localizacao_codigo

INTO :ESTABELECIMENTO_ID,
     :ESTABELECIMENTO_NOMEFANTASIA,
     :LOCALIZACAO_ID,
     :LOCALIZACAO_DESCRICAO,
     :TIPOPRODUTO_ID,
     :TIPOPRODUTO_DESCRICAO,
     :FAMILIA_ID,
     :FAMILIA_DESCRICAO,
     :PRODUTO_ID,
     :PRODUTO_DESCRICAO,
     :UM,
     :SALDO_FISICO,
     :SALDO_EMTERCEIRO,
     :CUSTO_MEDIO

DO BEGIN

    FOR
        select
            CMP,
            CS,
            CO,
            CMO,
            CIP,
            CIA,
            CD,
            CI,
            CT,
            --PERDA,
            --DEFEITOS,
            --PRODUZIDO,
            iif(PRODUZIDO > 0, DEFEITOS / PRODUZIDO, iif(DEFEITOS > 0, 100, 0)) PERDA,
            DESPESA
        from(
            SELECT AVG(CMP) CMP,
                   AVG(CS) CS,
                   AVG(CO) CO,
                   AVG(CMO) CMO,
                   AVG(CIP) CIP,
                   AVG(CIA) CIA,
                   AVG(CD) CD,
                   AVG(CI) CI,
                   AVG(CT) CT,
                   AVG(PERDA) PERDA,
                   sum(DEFEITOS) as DEFEITOS,
                   sum(PRODUZIDO) as PRODUZIDO,
                   AVG(DESPESA) DESPESA
            FROM (
            SELECT
                TAMANHO,
                TAMANHO_DESCRICAO,
                OPERACIONAL + INDIRETO + C AS CMP,
                CMS AS CS,                           
                CMO AS CO,
                CMS + CMO AS CMO,
                CMOIP + CSMOIP AS CIP,
                CMOIA + CSMOIA AS CIA,
                OPERACIONAL + INDIRETO + C + CMS + CMO AS CD,
                CMOIP + CSMOIP + CMOIA + CSMOIA AS CI,
                OPERACIONAL + INDIRETO + C + CMS + CMO +
                CMOIP + CSMOIP + CMOIA + CSMOIA AS CT,
                PERDA AS PERDA,
              --OPERACIONAL, -- CUSTO DE MAO DE OBRA ABSORVIDO DE OUTROS SETORES,
              --INDIRETO,    -- CUSTO INDIRETO ABSORVIDO DE OUTROS SETORES
              --TS,          -- TEMPO SETUP
              --"TO",        -- TEMPO OPERACIONAL
                IIF(FATOR_DESPESA > 0,
                ((TS / CAST(:vQTD AS INTEGER)) * FATOR_DESPESA ) + ("TO" * FATOR_DESPESA),0) DESPESA,
                DEFEITOS,
                PRODUZIDO
            
              FROM( SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.ANO,
                    C.MES,
                    C.NIVEL,
                    C.PRODUTO_DESCRICAO,
                    C.PRODUTO_CONSUMO,
                    C.TAMANHO_CONSUMO,
                    C.ORIGEM,
                    C.TS,
                    C."TO",
                    C.CMS / CAST(:vQTD AS INTEGER) AS CMS,
                    C.CMO,
                    C.CMOIP,
                    C.CMOIA,
                    C.CSMOIP  / CAST(:vQTD AS INTEGER) AS CSMOIP,
                    C.CSMOIA  / CAST(:vQTD AS INTEGER) AS CSMOIA,
                    C.PERDA,
                    C.C,
                    C.T,
                    C.CS  / CAST(:vQTD AS INTEGER) AS CS,
                    C.CO,
                    C.CUSTO_MEDIO,
                    C.FATOR_CONVERSAO,
                    C.TAMANHO,
                    C.CUSTO_MINUTO,
                    C.MOI_PROPRIO,
                    C.MOI_ABSORVIDO,
                    C.COIP,
                    C.COIA,
                    C.CSIP,
                    C.CSIA,
                    C.CONSUMO,
                    C.FLAG_TAMANHO,
                    C.GENEALOGIA,
                    C.DATA,
                    C.CUSTO,
                    C.DOLAR,
                    C.MARGEM,
                    C.OPERACIONAL,
                    C.INDIRETO,
                    D.FATOR FATOR_DESPESA,
                    C.DEFEITOS,
                    C.PRODUZIDO,
                    FN_TAMANHO_GRADE(P.GRADE_CODIGO,C.TAMANHO) TAMANHO_DESCRICAO 
                FROM TBCUSTO_PRODUTO C
                LEFT JOIN TBPRODUTO P ON C.PRODUTO_ID = P.CODIGO
                LEFT JOIN  TBCUSTO_DESPESA D ON D.MES = C.MES AND D.ANO = C.ANO AND D.FAMILIA_ID = P.FAMILIA_CODIGO
                WHERE C.ANO = :VANO
                  AND C.MES = :VMES
                  AND C.PRODUTO_ID = :PRODUTO_ID
            )
           )
         )
       INTO --:TAMANHO,:TAMANHO_DESCRICAO,
            :CMP,:CS,:CO,:CMO,:CIP,:CIA,:CD,:CI,:CT,
            :PERDA,:DESPESA
    
       DO BEGIN

           ANO = :VANO;
           MES = :VMES;
           ESTABELECIMENTO_ID = ESTABELECIMENTO_ID;
           ESTABELECIMENTO_NOMEFANTASIA = ESTABELECIMENTO_NOMEFANTASIA;
           LOCALIZACAO_ID = LOCALIZACAO_ID;
           LOCALIZACAO_DESCRICAO = LOCALIZACAO_DESCRICAO;
           TIPOPRODUTO_ID = TIPOPRODUTO_ID;
           TIPOPRODUTO_DESCRICAO = TIPOPRODUTO_DESCRICAO;
           FAMILIA_ID = FAMILIA_ID;
           FAMILIA_DESCRICAO = FAMILIA_DESCRICAO;
           PRODUTO_ID = PRODUTO_ID;
           PRODUTO_DESCRICAO = PRODUTO_DESCRICAO;
           UM = UM;
           TAMANHO = TAMANHO;
           TAMANHO_DESCRICAO = TAMANHO_DESCRICAO;
           SALDO_FISICO = SALDO_FISICO;
           SALDO_EMTERCEIRO = SALDO_EMTERCEIRO;
           CUSTO_MEDIO = CUSTO_MEDIO;
           CUSTO_TOTAL = CUSTO_MEDIO * (SALDO_FISICO + SALDO_EMTERCEIRO);

           PERDA = PERDA * :FATOR_PERDA;
           DESPESA = DESPESA * :FATOR_DESPESA;

           CUSTO_MP = CMP + (CMP * PERDA);
           CUSTO_MO = (CMO + CIP + CIA + DESPESA) + ((CMO + CIP + CIA + DESPESA) * PERDA);

           IF (COALESCE(CUSTO_MO,0) = 0 AND COALESCE(CUSTO_MP,0) = 0 ) THEN
               BEGIN
               CUSTO_MP = CUSTO_MEDIO / 2;
               CUSTO_MO = CUSTO_MEDIO / 2;
               END

           IF (COALESCE(CUSTO_MP,0) = 0 AND CUSTO_MO > 0 ) THEN
               BEGIN
               CUSTO_MP = CUSTO_MO;
               END

           IF (COALESCE(CUSTO_MO,0) = 0 AND CUSTO_MP > 0 ) THEN
               BEGIN
               CUSTO_MO = CUSTO_MP;
               END

           IF (LOCALIZACAO_ID = 14 OR LOCALIZACAO_ID = 21) THEN
               BEGIN
               CUSTO_MP = CUSTO_MP * :FATOR_CUSTO_MP;
               CUSTO_MO = CUSTO_MO * :FATOR_CUSTO_MO;
               END

           CUSTO_MP_MO    = CUSTO_MP + CUSTO_MO;
           CUSTO_MP_TOTAL = CUSTO_MP * (SALDO_FISICO + SALDO_EMTERCEIRO);
           CUSTO_MO_TOTAL = CUSTO_MO * (SALDO_FISICO + SALDO_EMTERCEIRO);
           CUSTO_MP_MO_TOTAL = CUSTO_MP_TOTAL + CUSTO_MO_TOTAL;

           CMP = CMP;
           CS  = CS;
           CO  = CO;
           CMO = CMO;
           CIP = CIP;
           CIA = CIA;
           CD  = CD;
           CI  = CI;
           CT  = CT; 

          SUSPEND;
          END

   END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_SALDO_RESUMIDO7 (
    ESTABELECIMENTO_1 integer,
    LOCALIZACAO_1 integer,
    FAMILIA_1 integer,
    MODELO_1 integer,
    MODELO_2 integer,
    MRP char(1))
returns (
    ESTABELECIMENTO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    SALDO numeric(10,4),
    UNIDADEMEDIDA_SIGLA varchar(10),
    GRADE_CODIGO integer,
    T01_SALDO numeric(10,4),
    T02_SALDO numeric(10,4),
    T03_SALDO numeric(10,4),
    T04_SALDO numeric(10,4),
    T05_SALDO numeric(10,4),
    T06_SALDO numeric(10,4),
    T07_SALDO numeric(10,4),
    T08_SALDO numeric(10,4),
    T09_SALDO numeric(10,4),
    T10_SALDO numeric(10,4),
    T11_SALDO numeric(10,4),
    T12_SALDO numeric(10,4),
    T13_SALDO numeric(10,4),
    T14_SALDO numeric(10,4),
    T15_SALDO numeric(10,4),
    T16_SALDO numeric(10,4),
    T17_SALDO numeric(10,4),
    T18_SALDO numeric(10,4),
    T19_SALDO numeric(10,4),
    T20_SALDO numeric(10,4),
    EM_TERCEIROS numeric(10,4),
    SALDO_REVISAO numeric(10,4),
    SALDO_ESTRAGADO numeric(10,4),
    ESTOQUE_MINIMO numeric(10,4),
    ESTOQUE_SEGURANCA char(1),
    OC_ABERTO numeric(10,4),
    COR_CODIGO integer)
as
BEGIN

if (:Mrp = '0') then
    Begin

FOR Select Distinct(A.Estabelecimento_Codigo), A.Localizacao_Codigo,
B.Codigo, B.Descricao, Coalesce(A.Saldo,0), B.UNIDADEMEDIDA_SIGLA,
B.Grade_Codigo,A.T01_Saldo, A.T02_Saldo, A.T03_Saldo, A.T04_Saldo,
A.T05_Saldo, A.T06_Saldo, A.T07_Saldo, A.T08_Saldo, A.T09_Saldo,
A.T10_Saldo, A.T11_Saldo, A.T12_Saldo, A.T13_Saldo, A.T14_Saldo,
A.T15_Saldo, A.T16_Saldo, A.T17_Saldo, A.T18_Saldo, A.T19_Saldo,
A.T20_Saldo, Coalesce(A.Saldo_EmTerceiro,0),

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Revisao and R.Saldo > 0),0) Saldo_Revisao,

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Estragado and R.Saldo > 0),0) Saldo_Estragado,

Coalesce((Select (R.QUANTIDADE) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo),0) ESTOQUE_MINIMO,

(Select (R.Estoque_Seguranca) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo) ESTOQUE_SEGURANCA,

Coalesce((Select Sum(Z.Quantidade) From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
Where  X.Oc = Y.Oc and Y.Controle = Z.Oc_Item_Controle and Y.Situacao = 1 and X.Status = 1
  and  X.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and Y.Produto_Codigo = B.CODIGO),0) OC,
  B.COR_CODIGO

From TbProduto B

Left Join TbEstoque_Saldo A On (A.Produto_Codigo = B.Codigo
and A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
and A.Localizacao_Codigo = :LOCALIZACAO_1)

Where B.Familia_Codigo     = :FAMILIA_1
and   B.Modelo_Codigo between :Modelo_1 and :Modelo_2
and   B.Status = '1'

Order By B.Descricao

INTO :Estabelecimento_Codigo,
     :Localizacao_Codigo,
     :Produto_Codigo,
     :Descricao,
     :Saldo,
     :UnidadeMedida_Sigla,
     :Grade_Codigo,
     :T01_Saldo, :T02_Saldo, :T03_Saldo, :T04_Saldo, :T05_Saldo,
     :T06_Saldo, :T07_Saldo, :T08_Saldo, :T09_Saldo, :T10_Saldo,
     :T11_Saldo, :T12_Saldo, :T13_Saldo, :T14_Saldo, :T15_Saldo,
     :T16_Saldo, :T17_Saldo, :T18_Saldo, :T19_Saldo, :T20_Saldo,
     :Em_Terceiros,   :Saldo_Revisao, :Saldo_Estragado,
     :Estoque_Minimo, :ESTOQUE_SEGURANCA, :Oc_Aberto, :COR_CODIGO

DO SUSPEND;
END 

ELSE

if (:Mrp = '1') then
BEGIN

FOR Select Distinct(A.Estabelecimento_Codigo), A.Localizacao_Codigo,
B.Codigo, B.Descricao, Coalesce(A.Saldo,0), B.UNIDADEMEDIDA_SIGLA,
B.Grade_Codigo,A.T01_Saldo, A.T02_Saldo, A.T03_Saldo, A.T04_Saldo,
A.T05_Saldo, A.T06_Saldo, A.T07_Saldo, A.T08_Saldo, A.T09_Saldo,
A.T10_Saldo, A.T11_Saldo, A.T12_Saldo, A.T13_Saldo, A.T14_Saldo,
A.T15_Saldo, A.T16_Saldo, A.T17_Saldo, A.T18_Saldo, A.T19_Saldo,
A.T20_Saldo, Coalesce(A.Saldo_EmTerceiro,0),

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Revisao and R.Saldo > 0),0) Saldo_Revisao,

Coalesce((Select First 1 Cast(R.Saldo as Numeric(15,4)) From TBEstoque_Saldo R, TbFamilia_Ficha FF
  Where R.Estabelecimento_Codigo = :Estabelecimento_1
    and R.Produto_Codigo = B.Codigo
    and R.Estabelecimento_Codigo = FF.Estabelecimento_Codigo
    and FF.Familia_Codigo = B.Familia_Codigo
    and R.Localizacao_Codigo = FF.Localizacao_Estragado and R.Saldo > 0),0) Saldo_Estragado,

Coalesce((Select (R.QUANTIDADE) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo),0) ESTOQUE_MINIMO,

(Select (R.Estoque_Seguranca) From TbEstoque_Minimo R
  Where R.Estabelecimento_Codigo = :ESTABELECIMENTO_1 and R.Localizacao_Codigo = :Localizacao_1 and R.Produto_Codigo = B.Codigo) ESTOQUE_SEGURANCA,

Coalesce((Select Sum(Z.Quantidade) From TbOc X, TbOc_Item Y, TbOC_Item_Saldo Z
Where  X.Oc = Y.Oc and Y.Controle = Z.Oc_Item_Controle and Y.Situacao = 1 and X.Status = 1
  and  X.Estabelecimento_Codigo = A.ESTABELECIMENTO_CODIGO and Y.Produto_Codigo = B.CODIGO),0) OC,
  B.COR_CODIGO

From TbProduto B, TbEstoque_Saldo A
Where A.Produto_Codigo = B.Codigo
and A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
and A.Localizacao_Codigo = :LOCALIZACAO_1 
and B.Familia_Codigo     = :FAMILIA_1
and B.Modelo_Codigo between :Modelo_1 and :Modelo_2
and (A.Saldo > 0 or A.Saldo_EmTerceiro > 0)

Order By B.Descricao

INTO :Estabelecimento_Codigo,
     :Localizacao_Codigo,
     :Produto_Codigo,
     :Descricao,
     :Saldo,
     :UnidadeMedida_Sigla,
     :Grade_Codigo,
     :T01_Saldo, :T02_Saldo, :T03_Saldo, :T04_Saldo, :T05_Saldo,
     :T06_Saldo, :T07_Saldo, :T08_Saldo, :T09_Saldo, :T10_Saldo,
     :T11_Saldo, :T12_Saldo, :T13_Saldo, :T14_Saldo, :T15_Saldo,
     :T16_Saldo, :T17_Saldo, :T18_Saldo, :T19_Saldo, :T20_Saldo,
     :Em_Terceiros,   :Saldo_Revisao, :Saldo_Estragado,
     :Estoque_Minimo, :ESTOQUE_SEGURANCA, :Oc_Aberto, :COR_CODIGO

DO SUSPEND;

END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_TRANSACAO_ITEM (
    TRANSACAO_CONTROLE_1 integer)
returns (
    OPERACAO_CODIGO varchar(3),
    DEFEITO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    GRADE_CODIGO integer,
    CONTROLE integer,
    QUANTIDADE numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    CONSUMO char(1),
    CUSTO_UNITARIO numeric(10,5),
    LOCALIZACAO_CODIGO integer,
    PRODUTO_LOCALIZACAO_CODIGO integer,
    MODELO_CODIGO integer,
    OPERACAO_TIPO char(1),
    DEFEITO_DESCRICAO varchar(30))
as
BEGIN
FOR Select A.operacao_codigo, A.defeito_codigo, A.produto_codigo, B.Descricao,
       B.UNIDADEMEDIDA_SIGLA, B.grade_codigo, A.controle, A.quantidade,
       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,
       A.Consumo, A.Custo_Unitario, A.Localizacao_Codigo, B.Localizacao_Codigo,
       B.Modelo_Codigo,
      (Select C.Tipo From TbOperacao C Where A.Operacao_Codigo = C.Codigo) Operacao_Tipo,
      (Select C.Descricao From TbSac_Defeito C Where A.defeito_codigo = C.Codigo) Defeito_Descricao
from TbEstoque_Transacao_Item A, TbProduto B
Where A.Produto_Codigo = B.Codigo
  and A.transacao_controle = :TRANSACAO_CONTROLE_1
Order By a.controle
INTO
   :operacao_codigo,
   :defeito_codigo,
   :produto_codigo,
   :descricao,
   :unidademedida_sigla,
   :grade_codigo,
   :controle,
   :quantidade,
   :t01, :t02, :t03, :t04, :t05, :t06, :t07, :t08, :t09, :t10,
   :t11, :t12, :t13, :t14, :t15, :t16, :t17, :t18, :t19, :t20,
   :Consumo,
   :Custo_Unitario,
   :Localizacao_Codigo,
   :Produto_Localizacao_Codigo,
   :Modelo_Codigo,
   :Operacao_Tipo,
   :Defeito_Descricao
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(10),
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select A.CODIGO, A.DESCRICAO, B.UNIDADEMEDIDA_SIGLA, 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 procedure SPC_FORM_MODELO2 (
    ESTABELECIMENTO_1 integer,
    UF_1 varchar(2),
    FAMILIA_1 integer,
    DESCRICAO_1 varchar(100))
returns (
    CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA char(10),
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select A.CODIGO, A.DESCRICAO, ' ', A.Grade_Codigo,
       A.CODIGO, 0,
       (Select C.Descricao From TbFamilia C Where C.Codigo = A.Familia_Codigo)
From TbModelo A
WHERE A.Codigo NOT IN
   (SELECT B.Modelo_Codigo
    FROM TbModelo_Preco B
    WHERE B.Estabelecimento_Codigo = :Estabelecimento_1
      and B.Modelo_Codigo = A.Codigo
      and B.UF = :Uf_1)
  and A.Status = 1
  and A.Familia_Codigo = :Familia_1
  and A.Descricao like :Descricao_1
Order by 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 procedure SPC_FORM_MODELO3 (
    ESTABELECIMENTO_1 integer,
    UF_1 varchar(2),
    FAMILIA_1 integer,
    DESCRICAO_1 varchar(100))
returns (
    CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA char(10),
    FAMILIA_CODIGO integer,
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select A.CODIGO, A.DESCRICAO, ' ', A.Familia_Codigo,
           A.Grade_Codigo, A.CODIGO, 0,
          (Select First 1 C.Descricao From TbFamilia C Where C.Codigo = A.Familia_Codigo)
From TbModelo A
WHERE A.Codigo NOT IN
   (SELECT B.Modelo_Codigo
    FROM TbModelo_Preco B
    WHERE B.Estabelecimento_Codigo = :Estabelecimento_1
      and B.Modelo_Codigo = A.Codigo
      and B.UF = :Uf_1)
  and A.Status = 1
  and A.Familia_Codigo = :Familia_1
  and A.Descricao like :Descricao_1
Order by A.Descricao
INTO
   :CODIGO,
   :DESCRICAO,
   :UNIDADEMEDIDA_SIGLA,
   :FAMILIA_CODIGO, 
   :GRADE_CODIGO,
   :modelo_codigo,
   :LOCALIZACAO_CODIGO,
   :FAMILIA_DESCRICAO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORM_PRODUTO3 (
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    CLASS integer,
    PATRIMONIO char(1),
    DESCRICAO_1 varchar(100))
returns (
    CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA char(10),
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select A.CODIGO, A.DESCRICAO, A.UNIDADEMEDIDA_SIGLA, A.GRADE_CODIGO,
           A.MODELO_CODIGO, A.LOCALIZACAO_CODIGO, B.DESCRICAO
From TbProduto A, TbFamilia B
Where A.Status = 1
  and(A.Familia_Codigo >= :FAMILIA_CODIGO_T or
      A.Familia_Codigo  = :FAMILIA_CODIGO_1)
  and A.Familia_Codigo = B.Codigo
  And B.Classificacao = :CLASS
  AND B.CONTROLE_PATRIMONIO LIKE :PATRIMONIO
  and A.Descricao like :Descricao_1
Order by 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 procedure SPC_FORM_PRODUTO_COR (
    DESCRICAO_1 varchar(100),
    MODELO_1 integer,
    MODELO_2 integer)
returns (
    DESCRICAO varchar(100),
    CODIGO integer,
    UNIDADEMEDIDA_SIGLA char(10),
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select
Distinct(Trim(Replace(A.Descricao,C.Descricao,''))), 0,
A.UNIDADEMEDIDA_SIGLA, A.GRADE_CODIGO, A.FAMILIA_CODIGO, A.LOCALIZACAO_CODIGO,
--NO CAMPO MODELO_CODIGO SERA VISUALIZADO O VALOR DO CAMPO FAMILIA_CODIGO
--PARA SER USADO EXCLUSIVAMENTE NO FORM 3.16 (CAD.PROD.POR COR)
(Select C.Descricao From TbFamilia C Where C.Codigo = A.Familia_Codigo)

From TbProduto A, TbCor C
Where A.Descricao like :Descricao_1
and A.Cor_Codigo = C.Codigo
and A.Modelo_Codigo between :Modelo_1 and :Modelo_2

and Character_length(Trim(Replace(A.Descricao,C.Descricao,''))) > 0

Order by 1
INTO
   :DESCRICAO,
   :CODIGO,
   :UNIDADEMEDIDA_SIGLA,
   :GRADE_CODIGO,
   :MODELO_CODIGO,
   :LOCALIZACAO_CODIGO ,
   :FAMILIA_DESCRICAO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORM_PRODUTO_COR2 (
    DESCRICAO_1 varchar(100),
    MODELO_1 integer,
    MODELO_2 integer)
returns (
    DESCRICAO varchar(100),
    CODIGO integer,
    UNIDADEMEDIDA_SIGLA char(10),
    FAMILIA_CODIGO integer,
    GRADE_CODIGO integer,
    MODELO_CODIGO integer,
    LOCALIZACAO_CODIGO integer,
    FAMILIA_DESCRICAO varchar(20))
as
BEGIN
FOR Select
Distinct(Trim(Replace(A.Descricao,C.Descricao,''))), 0,
A.UNIDADEMEDIDA_SIGLA, A.FAMILIA_CODIGO, A.GRADE_CODIGO, A.MODELO_CODIGO, A.LOCALIZACAO_CODIGO,
(Select C.Descricao From TbFamilia C Where C.Codigo = A.Familia_Codigo)

From TbProduto A, TbCor C
Where A.Descricao like :Descricao_1
and A.Cor_Codigo = C.Codigo
and A.Modelo_Codigo between :Modelo_1 and :Modelo_2
and Character_length(Trim(Replace(A.Descricao,C.Descricao,''))) > 0

Order by 1
INTO
   :DESCRICAO,
   :CODIGO,
   :UNIDADEMEDIDA_SIGLA,
   :FAMILIA_CODIGO,
   :GRADE_CODIGO,
   :MODELO_CODIGO,
   :LOCALIZACAO_CODIGO ,
   :FAMILIA_DESCRICAO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_NFS_NFE2 (
    ESTABELECIMENTO_1 integer,
    EMPRESA_1 integer)
returns (
    CONTROLE integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    LOCALIZACAO_CODIGO integer,
    NCM_CODIGO varchar(10),
    GRADE_CODIGO integer,
    NOTAFISCAL_NUMERO integer,
    PRODUTO_VALOR_UNITARIO numeric(10,5),
    QUANTIDADE numeric(10,5),
    QUANTIDADE_SALDO numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    TRIBUTACAO_ICMS integer,
    TRIBUTACAO_IPI varchar(2),
    TRIBUTACAO_ORIGEM integer,
    BASECALCULO_ICMS numeric(10,5),
    PERCENTUAL_ICMS numeric(10,5),
    PERCENTUAL_IPI numeric(10,5),
    PERCENTUAL_PIS numeric(10,5),
    PERCENTUAL_COFINS numeric(10,5),
    SEQUENCIA integer,
    DATA_ENTRADA date,
    CFOP_CODIGO varchar(5),
    OPERACAO_CODIGO varchar(3),
    TRIBUTACAO_PIS char(2),
    TRIBUTACAO_COFINS char(2),
    MODALIDADE_ICMS char(1),
    MODALIDADE_ICMS_ST char(1),
    MARGEM_ICMS_ST numeric(15,4),
    REDUCAO_ICMS_ST numeric(15,4),
    BASECALCULO_ICMS_ST numeric(15,4),
    ALIQUOTA_ICMS_ST numeric(15,4),
    VALOR_ICMS_ST numeric(15,4),
    SALDO_REVISAO numeric(15,4))
as
BEGIN
FOR
Select B.CONTROLE, B.PRODUTO_CODIGO, B.PRODUTO_DESCRICAO, B.PRODUTO_UNIDADEMEDIDA,
       B.LOCALIZACAO_CODIGO, B.NCM_CODIGO, C.GRADE_CODIGO, B.NUMERO_NOTAFISCAL,
       B.VALOR_UNITARIO, B.QUANTIDADE, A.QUANTIDADE,
       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,
       B.TRIBUTACAO_ICMS, B.TRIBUTACAO_IPI, B.TRIBUTACAO_ORIGEM, B.BASECALCULO_ICMS,
       B.PERCENTUAL_ICMS, B.PERCENTUAL_IPI, B.PERCENTUAL_PIS, B.PERCENTUAL_COFINS,
       B.SEQUENCIA, B.DATA_ENTRADA, B.CFOP_CODIGO, B.OPERACAO_CODIGO,
       B.TRIBUTACAO_PIS, B.TRIBUTACAO_COFINS,
       B.MODALIDADE_ICMS, B.MODALIDADE_ICMS_ST, B.MARGEM_ICMS_ST, B.REDUCAO_ICMS_ST,
       B.BASECALCULO_ICMS_ST, B.ALIQUOTA_ICMS_ST, B.VALOR_ICMS_ST, A.SALDO_REVISAO
From TbNfe_Item B, TbNfe_Item_Saldo A, TbOperacao D, TbProduto C
Where A.Nfe_Item_Controle =  B.Controle
  AND B.Operacao_Codigo = D.Codigo
  and B.Produto_Codigo = C.Codigo
  and B.Situacao < 3 and B.Numero_NotaFiscal > 0 and A.Quantidade > 0
  and B.Estabelecimento_Codigo   = :ESTABELECIMENTO_1
  and B.Empresa_Codigo           = :EMPRESA_1
  and D.Controle_Estoque_Externo = '0'
  and D.Exige_Nf_Referencia      = '0'
Order By B.Numero_NotaFiscal, B.Sequencia
INTO
    :CONTROLE, :PRODUTO_CODIGO, :DESCRICAO, :UNIDADEMEDIDA_SIGLA,
    :LOCALIZACAO_CODIGO, :NCM_CODIGO, GRADE_CODIGO, :NOTAFISCAL_NUMERO,
    :PRODUTO_VALOR_UNITARIO, :QUANTIDADE, :QUANTIDADE_SALDO,
    :T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
    :T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:T20,
    :TRIBUTACAO_ICMS, :TRIBUTACAO_IPI, :TRIBUTACAO_ORIGEM, :BASECALCULO_ICMS,
    :PERCENTUAL_ICMS, :PERCENTUAL_IPI, :PERCENTUAL_PIS, :PERCENTUAL_COFINS,
    :SEQUENCIA, :DATA_ENTRADA, :CFOP_CODIGO, :OPERACAO_CODIGO,
    :TRIBUTACAO_PIS, :TRIBUTACAO_COFINS,
    :MODALIDADE_ICMS, :MODALIDADE_ICMS_ST, :MARGEM_ICMS_ST, :REDUCAO_ICMS_ST,
    :BASECALCULO_ICMS_ST, :ALIQUOTA_ICMS_ST, :VALOR_ICMS_ST, :SALDO_REVISAO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_NFS_NFEXTERNO2 (
    ESTABELECIMENTO_1 integer,
    EMPRESA_1 integer)
returns (
    CONTROLE integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    LOCALIZACAO_CODIGO integer,
    NCM_CODIGO varchar(10),
    GRADE_CODIGO integer,
    NOTAFISCAL_NUMERO integer,
    PRODUTO_VALOR_UNITARIO numeric(10,5),
    QUANTIDADE numeric(10,5),
    QUANTIDADE_SALDO numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    NOTAFISCAL_DATA_ENTRADA date,
    OPERACAO_CODIGO varchar(3))
as
BEGIN
FOR
Select B.CONTROLE, B.PRODUTO_CODIGO, B.PRODUTO_DESCRICAO, B.PRODUTO_UNIDADEMEDIDA,
       B.LOCALIZACAO_CODIGO, B.NCM_CODIGO, C.GRADE_CODIGO, B.NUMERO_NOTAFISCAL,
       B.VALOR_UNITARIO, B.QUANTIDADE, A.QUANTIDADE,
       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,
       B.DATA_ENTRADA, B.OPERACAO_CODIGO
From TbNfe_Item B, TbNfe_Item_Saldo A, TbOperacao D, TbProduto C
WHERE A.Nfe_Item_Controle = B.Controle
  AND B.produto_codigo    = C.Codigo
  AND B.Operacao_Codigo   = D.Codigo
  and B.Situacao < 3 and B.Numero_NotaFiscal > 0 and A.Quantidade > 0
  and B.Estabelecimento_Codigo   = :ESTABELECIMENTO_1
  and B.Empresa_Codigo           = :EMPRESA_1
  and D.Controle_Estoque_Externo = '1'
  and D.Exige_Nf_Referencia      = '0'
Order By B.Numero_NotaFiscal 
INTO
    :CONTROLE, :PRODUTO_CODIGO, :DESCRICAO, :UNIDADEMEDIDA_SIGLA,
    :LOCALIZACAO_CODIGO, :NCM_CODIGO, GRADE_CODIGO, :NOTAFISCAL_NUMERO,
    :PRODUTO_VALOR_UNITARIO, :QUANTIDADE, :QUANTIDADE_SALDO,
    :T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
    :T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:T20,
    :NOTAFISCAL_DATA_ENTRADA, :OPERACAO_CODIGO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PEDIDO_PROCESSADO_ITEM (
    ESTABELECIMENTO_CODIGO_1 integer,
    FAMILIA_CODIGO_1 integer,
    REMESSA_1 integer)
returns (
    "Pedido" integer,
    "Pedido_Item_Sequencia" integer,
    "Pedido_Processado_Data" date,
    "Data_Liberacao" date,
    "Quantidade" numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    "Setor_Codigo" integer,
    "Cliente_Codigo" integer,
    "Remessa_Controle" integer,
    "Controle" integer,
    "Pedido_Item_Produto_Codig" integer,
    "Descricao" varchar(100),
    "Grade_Codigo" integer,
    "Situacao" integer,
    "Pedido_Processado_Control" integer,
    "Pedido_Item_Controle" integer,
    "UnidadeMedida_Sigla" varchar(10),
    "Cor_Codigo" integer,
    "Modelo_Codigo" integer,
    "Estabelecimento_Codigo" integer,
    "Familia_Codigo" integer,
    "Remessa" integer,
    "Remessa_Turno_Codigo" integer)
as
BEGIN
FOR Select A.Pedido, A.Pedido_Item_Sequencia, A.Pedido_Processado_Data,A.Data_Liberacao,
A.Quantidade,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,A.Setor_Codigo, A.Cliente_Codigo, A.Remessa_Controle,
A.Controle, A.Pedido_Item_Produto_Codig, B.Descricao, B.Grade_Codigo, A.Situacao,
A.Pedido_Processado_Control, A.Pedido_Item_Controle, B.UNIDADEMEDIDA_SIGLA, B.Cor_Codigo,
B.Modelo_Codigo, A.Estabelecimento_Codigo, A.Familia_Codigo, A.Remessa, A.Remessa_Turno_Codigo
From TbPedido_Processado_Item A, TbProduto B
Where A.Pedido_Item_Produto_Codig = B.Codigo
  and A.Remessa > 0
  and A.ESTABELECIMENTO_CODIGO = :"ESTABELECIMENTO_CODIGO_1"
  and B.FAMILIA_CODIGO = :"FAMILIA_CODIGO_1"
  and A.REMESSA        = :"REMESSA_1"
INTO :"Pedido",
     :"Pedido_Item_Sequencia",
     :"Pedido_Processado_Data",
     :"Data_Liberacao",
     :"Quantidade",
     :"T01", :"T02", :"T03", :"T04",
     :"T05", :"T06", :"T07", :"T08",
     :"T09", :"T10", :"T11", :"T12",
     :"T13", :"T14", :"T15", :"T16",
     :"T17", :"T18", :"T19", :"T20",
     :"Setor_Codigo"     ,
     :"Cliente_Codigo"   ,
     :"Remessa_Controle" ,
     :"Controle"         ,
     :"Pedido_Item_Produto_Codig",
     :"Descricao"        ,
     :"Grade_Codigo",
     :"Situacao",
     :"Pedido_Processado_Control",
     :"Pedido_Item_Controle",
     :"UnidadeMedida_Sigla",
     :"Cor_Codigo",
     :"Modelo_Codigo",
     :"Estabelecimento_Codigo", 
     :"Familia_Codigo", 
     :"Remessa",
     :"Remessa_Turno_Codigo"     
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PEDIDO_PROCESSADO_ITEM2 (
    ESTABELECIMENTO_CODIGO_1 integer,
    FAMILIA_CODIGO_1 integer,
    PEDIDO_T varchar(20),
    PEDIDO_1 varchar(20),
    CLIENTE_1 integer,
    CLIENTE_2 integer,
    MODELO_1 integer,
    MODELO_2 integer,
    PRODUTO_1 integer,
    PRODUTO_2 integer)
returns (
    "Pedido" integer,
    "Pedido_Item_Sequencia" integer,
    "Pedido_Processado_Data" date,
    "Data_Liberacao" date,
    "Quantidade" numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    "Setor_Codigo" integer,
    "Cliente_Codigo" integer,
    "Remessa_Controle" integer,
    "Controle" integer,
    "Pedido_Item_Produto_Codig" integer,
    "Descricao" varchar(100),
    "Grade_Codigo" integer,
    "Situacao" integer,
    "Pedido_Processado_Control" integer,
    "Pedido_Item_Controle" integer,
    "UnidadeMedida_Sigla" varchar(10),
    "Cor_Codigo" integer,
    "Modelo_Codigo" integer,
    "Estabelecimento_Codigo" integer,
    "Familia_Codigo" integer,
    "Remessa" integer,
    "Remessa_Turno_Codigo" integer,
    PEDIDO_CLIENTE varchar(20))
as
BEGIN
FOR Select A.Pedido, A.Pedido_Item_Sequencia, A.Pedido_Processado_Data,A.Data_Liberacao,
A.Quantidade,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,
A.Setor_Codigo, A.Cliente_Codigo, A.Remessa_Controle,
A.Controle, A.Pedido_Item_Produto_Codig,B.Descricao,B.Grade_Codigo,
A.Situacao,A.Pedido_Processado_Control,A.Pedido_Item_Controle,
B.UNIDADEMEDIDA_SIGLA,B.Cor_Codigo,B.Modelo_Codigo,A.Estabelecimento_Codigo, A.Familia_Codigo,
A.Remessa,A.Remessa_Turno_Codigo, C.Pedido_Cliente
From TbPedido_Processado_Item A, TbProduto B, TbPedido C
Where A.Pedido_Item_Produto_Codig = B.Codigo
  and A.Pedido = C.Pedido
  and A.Remessa = 0 and A.Situacao  = 1
  and A.ESTABELECIMENTO_CODIGO = :"ESTABELECIMENTO_CODIGO_1"
  and A.FAMILIA_CODIGO = :"FAMILIA_CODIGO_1"
  and (C.Pedido_Cliente <>   :PEDIDO_T or
       C.Pedido_Cliente Like :PEDIDO_1)
  and C.cliente_codigo Between :Cliente_1 and :Cliente_2
  and B.Modelo_Codigo Between :Modelo_1 and :Modelo_2
  and B.Codigo Between :Produto_1 and :Produto_2
Order By A.Pedido_Processado_Data, A.Pedido,A.Pedido_Item_Sequencia
INTO :"Pedido",
     :"Pedido_Item_Sequencia",
     :"Pedido_Processado_Data",
     :"Data_Liberacao",
     :"Quantidade",
     :"T01", :"T02", :"T03", :"T04",
     :"T05", :"T06", :"T07", :"T08",
     :"T09", :"T10", :"T11", :"T12",
     :"T13", :"T14", :"T15", :"T16",
     :"T17", :"T18", :"T19", :"T20",
     :"Setor_Codigo"     ,
     :"Cliente_Codigo"   ,
     :"Remessa_Controle" ,
     :"Controle"         ,
     :"Pedido_Item_Produto_Codig",
     :"Descricao"        ,
     :"Grade_Codigo",
     :"Situacao",
     :"Pedido_Processado_Control",
     :"Pedido_Item_Controle",
     :"UnidadeMedida_Sigla",
     :"Cor_Codigo",
     :"Modelo_Codigo",
     :"Estabelecimento_Codigo",
     :"Familia_Codigo",
     :"Remessa",
     :"Remessa_Turno_Codigo",
     :Pedido_Cliente 
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_PEDIDO (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(10),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    PROJECAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    For
    Select
      Modelo_Id,
      Cor_Id,
      Tamanho,
     (Saldo_Faturar - Aloc_Est - Aloc_Rem) as Quantidade
    
    From (
    Select
      A.Modelo_Codigo Modelo_Id, A.Cor_Id, A.Tamanho,
      Cast(Sum(S.Quantidade) as Numeric(15,4)) Saldo_Faturar,
      Cast(Sum(A.Qtd_Est) as Numeric(15,4)) Aloc_Est,
      Cast(Sum(A.Qtd_Rem) as Numeric(15,4)) Aloc_Rem
    
    From TbPedido_Item A, TbPedido P, TbPedido_Item_Saldo S
    Where A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
      and A.Estabelecimento_Codigo =  P.Estabelecimento_Codigo
      and A.Controle = S.Pedido_Item_Controle
      and A.Pedido = P.Pedido
      and P.DATA between '01.01.2015' and current_date
      and P.STATUS=1
      and P.SITUACAO=1
      and A.situacao=1
    
    Group By A.Modelo_Codigo, A.Cor_Id, A.Tamanho)
    Where (Saldo_Faturar - Aloc_Est - Aloc_Rem) > 0
    
    Into :yModelo_Id, :yCor_Id, :yTamanho, :Quantidade
    Do
    
    Begin

    For

       SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.Tam,
        Cast((
         (Case When (Cast(:yTamanho as integer)= 0) and (B.CONSUMO_QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4))  Quantidade
        
         FROM TBMODELO_CONSUMO B, TbProduto P
        WHERE B.MODELO_Codigo = :yModelo_id
          and B.CONSUMO_PRODUTO_CODIGO = P.Codigo
          and P.Familia_Codigo = :Familia_1

        Union
        
        SELECT B.PRODUTO_ID, B.Tam,
         Cast((
         (Case When (Cast(:yTamanho as integer)= 0) and (B.QUANTIDADE     > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 1) and (B.T01 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 2) and (B.T02 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 3) and (B.T03 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 4) and (B.T04 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 5) and (B.T05 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 6) and (B.T06 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 7) and (B.T07 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 8) and (B.T08 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)= 9) and (B.T09 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=10) and (B.T10 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=11) and (B.T11 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=12) and (B.T12 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=13) and (B.T13 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=14) and (B.T14 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=15) and (B.T15 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=16) and (B.T16 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=17) and (B.T17 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=18) and (B.T18 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=19) and (B.T19 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end) +
         (Case When (Cast(:yTamanho as integer)=20) and (B.T20 > 0) Then Cast( (Cast(:Quantidade as Numeric(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) as Numeric(15,4)) else 0 end)) as Numeric(15,4)) Quantidade
        
         FROM TBMODELO_CONSUMO_COR B, TbProduto P
        WHERE B.MODELO_ID = :yModelo_id
          AND B.COR_ID = :yCor_id
          and B.PRODUTO_ID = P.Codigo
          and P.Familia_Codigo = :Familia_1

     Into :vProduto_Id, :vTam, vProjecao
       Do
       Begin
        insert into TMP10168_1 values(0,'',:vProduto_Id,:vTam,0,'','',0,'',:vProjecao,0);
       End

  End

  For

    Select V.PRODUTO_ID,V.MODELO_ID,V.MODELO_DESCRICAO,V.COR_ID,V.COR_DESCRICAO,
           V.TAMANHO_ID, V.TAMANHO,V.UM,V.LOCALIZACAO_ID,V.ESTOQUE,V.EM_PRODUCAO,
           V.EMPENHADO,V.PROJECAO,V.EST_MIN,V.EST_MAX, V.SEGURANCA,
           V.PERC_PONTO_REP, V.QTD_PONTO_REP, V.TIPO_REP,V.QTD_REP,V.NECESSIDADE,
          (Select First 1 M.Densidade From TbModelo M Where M.Codigo = V.MODELO_ID),
          (Select First 1 M.Espessura From TbModelo M Where M.Codigo = V.MODELO_ID)

    From (
    Select X.Produto_Id, X.MODELO_ID,X.MODELO_DESCRICAO,X.COR_ID,X.COR_DESCRICAO,
           X.TAMANHO_ID, X.TAMANHO,X.UM,X.LOCALIZACAO_ID, X.ESTOQUE, X.EM_PRODUCAO,
           X.EMPENHADO, X.PROJECAO, X.ESTOQUE_MINIMO EST_MIN, X.ESTOQUE_MAXIMO EST_MAX, X.SEGURANCA,
           X.PONTO_REPOSICAO PERC_PONTO_REP, X.QUANTIDADE_PONTO_REPOSICAO QTD_PONTO_REP,
           IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
           IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) QTD_REP,

           IIF( X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO < X.QUANTIDADE_PONTO_REPOSICAO,
                 IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) -
                (X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO), 0) NECESSIDADE
    From (
    Select P.Codigo Produto_Id, P.MODELO_CODIGO MODELO_ID,
          (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
           P.COR_CODIGO COR_ID, (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
           0 TAMANHO_ID, Cast('' as VarChar(10)) TAMANHO, P.UNIDADEMEDIDA_SIGLA UM,
           P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
    
     Coalesce(Cast((SELECT First 1 Sum(S.Projecao)
      From TMP10168_1 S
     Where S.Produto_id = P.Codigo) as Numeric(15,4)),0.0000) PROJECAO,

     Coalesce(Cast((SELECT First 1 Sum(S.SALDO)
      From TbEstoque_Saldo S
     Where S.Produto_Codigo = P.Codigo And S.Localizacao_Codigo = P.Localizacao_Codigo
       And S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) as Numeric(15,4)),0.0000) Estoque,
    
     Coalesce(Cast((Select Cast(Sum(E.Consumo_Kg-Coalesce(E.Quantidade_Conferencia,0)) as Numeric(15,4))
      From TbRemessa_Consumo E
     Where E.PRODUTO_ID = P.Codigo
       and E.Conferencia = '0'
       and Coalesce(E.Componente,'0') = '0'
       and E.Estabelecimento_Id = :Estabelecimento_1
       and E.Localizacao_Id = P.Localizacao_Codigo
       and E.Remessa >= -1) as Numeric(15,4)),0.0000)  Empenhado,

     Coalesce(Cast((Select Sum(PG.QUANTIDADE)
      From TbProgramacao PG
     Where PG.PRODUTO_ID = P.CODIGO
       and PG.Estabelecimento_Id = :Estabelecimento_1
       and PG.Tipo in ('A','D')
       and PG.STATUS in ('0','1','2')) as Numeric(15,4)),0.0000)  Em_Producao,
    
    Coalesce(Cast(B.QUANTIDADE * (Coalesce(B.Ponto_Reposicao,100.0000) / 100.0000) as Numeric(15,4)),0.0000) QUANTIDADE_PONTO_REPOSICAO,
    Coalesce(B.QUANTIDADE,0.0000) Estoque_Minimo,
    Coalesce(B.PONTO_REPOSICAO,0.0000) PONTO_REPOSICAO,
    Coalesce(B.Estoque_Max,0.0000) Estoque_Maximo,
    Coalesce(B.TIPO_REPOSICAO,'1') Tipo_Reposicao,

    Coalesce(P.Seguranca,0.00) / 100.00 Seguranca
    
    From TbProduto P  
    Left Join TbEstoque_Minimo B ON B.Estabelecimento_Codigo = :Estabelecimento_1
                                and B.Localizacao_Codigo = P.Localizacao_Codigo
                                and B.PRODUTO_Codigo = P.Codigo and B.QUANTIDADE > 0
    Where P.Familia_Codigo = :Familia_1
      and P.Status = '1'
      and P.Grade_Codigo = 0

    
    ) X
    ) V Where V.NECESSIDADE > 0

  Into  :xPRODUTO_ID, :xModelo_Id, :xMODELO_DESCRICAO, :xCOR_Id, :xCOR_DESCRICAO,
        :xTAMANHO_ID, :xTAMANHO, :xUM, :xLOCALIZACAO_ID, :xESTOQUE,
        :xEM_PRODUCAO, :xEMPENHADO, :xPROJECAO, :xEST_MIN, :xEST_MAX, :xSEGURANCA,
        :xPERC_PONTO_REP, :xQTD_PONTO_REP, :xTIPO_REP, :xQTD_REP, :xNECESSIDADE,
        :xDensidade, :xEspessura

    Do
      
      Begin

      if (:xPRODUTO_ID > 0) then
          Begin
            produto_id = :Xproduto_id ;
            modelo_id = :Xmodelo_id;
            modelo_descricao = :Xmodelo_descricao;
            cor_id = :Xcor_id;
            cor_descricao = :Xcor_descricao;
            tamanho_id = :Xtamanho_id;
            tamanho = :Xtamanho;
            um = :Xum;
            localizacao_id = :Xlocalizacao_id ;
            estoque = :Xestoque ;
            empenhado = :Xempenhado ;
            em_producao = :Xem_producao ;
            projecao = :Xprojecao ;
            est_min = :Xest_min ;
            est_max = :Xest_max ;
            seguranca = :Xseguranca ;
            perc_ponto_rep = :Xperc_ponto_rep ;
            qtd_ponto_rep = :Xqtd_ponto_rep ;
            tipo_rep = :Xtipo_rep ;
            qtd_rep = :Xqtd_rep ;
            NECESSIDADE = :XNECESSIDADE ;
            PROGRAMAR = (Select Valor2 From ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            Densidade = :xDensidade;
            Espessura = :xEspessura;
            FILTRO = :produto_id||' '||:modelo_id||' '||:modelo_descricao||' '||:cor_descricao||' '||:tamanho;
            Suspend;
          End
      End 

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_REMESSA (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(10),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    PROJECAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XPROJECAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    /* COLETA OS ITENS DE PEDIDOS COM SALDO A FATURAR DESCONTANDO O QUE ESTA NO ESTOQUE E EM REMESSAS */
    FOR
        SELECT
            MODELO_ID,
            COR_ID,
            TAMANHO,
            (SALDO_FATURAR - ALOC_EST - ALOC_REM) AS QUANTIDADE
        
        FROM
           (SELECT
                A.MODELO_CODIGO MODELO_ID,
                A.COR_ID,
                A.TAMANHO,
                CAST(SUM(S.QUANTIDADE) AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(SUM(A.QTD_EST   ) AS NUMERIC(15,4)) ALOC_EST,
                CAST(SUM(A.QTD_REM   ) AS NUMERIC(15,4)) ALOC_REM
        
            FROM
                TBPEDIDO_ITEM A,
                TBPEDIDO P,
                TBPEDIDO_ITEM_SALDO S

            WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
              AND A.ESTABELECIMENTO_CODIGO =  P.ESTABELECIMENTO_CODIGO
              AND A.CONTROLE              = S.PEDIDO_ITEM_CONTROLE
              AND A.PEDIDO                = P.PEDIDO
              AND P.STATUS                = 1
              AND P.SITUACAO              = 1
              AND A.SITUACAO              = 1
              AND P.DATA            BETWEEN '01.01.2015' AND CURRENT_DATE
        
            GROUP BY
                A.MODELO_CODIGO,
                A.COR_ID,
                A.TAMANHO)
        WHERE
            (SALDO_FATURAR - ALOC_EST - ALOC_REM) > 0
    
    INTO
        :YMODELO_ID,
        :YCOR_ID,
        :YTAMANHO,
        :QUANTIDADE
    DO
    BEGIN
        
        
        /* COLETA O CONSUMO DOS ITENS DOS PEDIDOS */
        FOR
            /* CONSULTA A FICHA TECNICA 2 (GERAL) */
            SELECT
                B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID, B.TAM,
                CAST((
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 0) AND (B.CONSUMO_QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 1) AND (B.CONSUMO_QUANTIDADE_T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 2) AND (B.CONSUMO_QUANTIDADE_T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 3) AND (B.CONSUMO_QUANTIDADE_T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 4) AND (B.CONSUMO_QUANTIDADE_T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 5) AND (B.CONSUMO_QUANTIDADE_T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 6) AND (B.CONSUMO_QUANTIDADE_T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 7) AND (B.CONSUMO_QUANTIDADE_T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 8) AND (B.CONSUMO_QUANTIDADE_T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 9) AND (B.CONSUMO_QUANTIDADE_T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=10) AND (B.CONSUMO_QUANTIDADE_T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=11) AND (B.CONSUMO_QUANTIDADE_T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=12) AND (B.CONSUMO_QUANTIDADE_T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=13) AND (B.CONSUMO_QUANTIDADE_T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=14) AND (B.CONSUMO_QUANTIDADE_T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=15) AND (B.CONSUMO_QUANTIDADE_T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=16) AND (B.CONSUMO_QUANTIDADE_T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=17) AND (B.CONSUMO_QUANTIDADE_T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=18) AND (B.CONSUMO_QUANTIDADE_T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=19) AND (B.CONSUMO_QUANTIDADE_T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=20) AND (B.CONSUMO_QUANTIDADE_T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.CONSUMO_QUANTIDADE_T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4))  QUANTIDADE
            
            FROM
                TBMODELO_CONSUMO B,
                TBPRODUTO P

            WHERE B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
              AND B.MODELO_CODIGO          = :YMODELO_ID
              AND P.FAMILIA_CODIGO         = :FAMILIA_1
        
            UNION
            
            /* CONSULTA A FICHA TECNICA 3 (POR COR) */
            SELECT
                B.PRODUTO_ID,
                B.TAM,
                CAST((
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 0) AND (B.QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.QUANTIDADE    /B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 1) AND (B.T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T01/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 2) AND (B.T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T02/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 3) AND (B.T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T03/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 4) AND (B.T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T04/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 5) AND (B.T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T05/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 6) AND (B.T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T06/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 7) AND (B.T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T07/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 8) AND (B.T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T08/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)= 9) AND (B.T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T09/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=10) AND (B.T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T10/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=11) AND (B.T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T11/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=12) AND (B.T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T12/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=13) AND (B.T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T13/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=14) AND (B.T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T14/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=15) AND (B.T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T15/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=16) AND (B.T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T16/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=17) AND (B.T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T17/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=18) AND (B.T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T18/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=19) AND (B.T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T19/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                    (CASE WHEN (CAST(:YTAMANHO AS INTEGER)=20) AND (B.T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST((B.T20/B.FATOR_CONVERSAO)AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4)) QUANTIDADE
            
            FROM
                TBMODELO_CONSUMO_COR B,
                TBPRODUTO P

            WHERE B.MODELO_ID      = :YMODELO_ID
              AND B.COR_ID         = :YCOR_ID
              AND B.PRODUTO_ID     = P.CODIGO
              AND P.FAMILIA_CODIGO = :FAMILIA_1
    
        INTO
            :VPRODUTO_ID,
            :VTAM,
            :VPROJECAO
        DO
        BEGIN
            INSERT INTO TMP10168_1 VALUES(0,'',:VPRODUTO_ID,:VTAM,0,'','',0,'',:VPROJECAO,0);
        END
  END

    FOR
        SELECT
            V.PRODUTO_ID,
            V.MODELO_ID,
            V.MODELO_DESCRICAO,
            V.COR_ID,
            V.COR_DESCRICAO,
            V.TAMANHO_ID,
            V.TAMANHO,
            V.UM,
            V.LOCALIZACAO_ID,
            V.ESTOQUE,
            V.EM_PRODUCAO,
            V.EMPENHADO,
            V.PROJECAO,
            V.EST_MIN,
            V.EST_MAX,
            V.SEGURANCA,
            V.PERC_PONTO_REP,
            V.QTD_PONTO_REP,
            V.TIPO_REP,
            V.QTD_REP,
            V.NECESSIDADE,
            (SELECT FIRST 1 M.DENSIDADE FROM TBMODELO M WHERE M.CODIGO = V.MODELO_ID),
            (SELECT FIRST 1 M.ESPESSURA FROM TBMODELO M WHERE M.CODIGO = V.MODELO_ID)
    
        FROM
            (SELECT
                X.PRODUTO_ID,
                X.MODELO_ID,
                X.MODELO_DESCRICAO,
                X.COR_ID,
                X.COR_DESCRICAO,
                X.TAMANHO_ID,
                X.TAMANHO,
                X.UM,
                X.LOCALIZACAO_ID,
                X.ESTOQUE,
                X.EM_PRODUCAO,
                X.EMPENHADO,
                X.PROJECAO,
                X.ESTOQUE_MINIMO EST_MIN,
                X.ESTOQUE_MAXIMO EST_MAX,
                X.SEGURANCA,
                X.PONTO_REPOSICAO PERC_PONTO_REP,
                X.QUANTIDADE_PONTO_REPOSICAO QTD_PONTO_REP,
                IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
                IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) QTD_REP,
                IIF(X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO - X.PROJECAO < X.QUANTIDADE_PONTO_REPOSICAO,
                    IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) -
                    (X.ESTOQUE + X.EM_PRODUCAO - X.EMPENHADO /* - X.PROJECAO */ ), 0) NECESSIDADE
            FROM
               (SELECT
                    P.CODIGO PRODUTO_ID,
                    P.MODELO_CODIGO MODELO_ID,
    
                    (SELECT FIRST 1 M.DESCRICAO
                       FROM TBMODELO M
                      WHERE M.CODIGO = P.MODELO_CODIGO) MODELO_DESCRICAO,
    
                    P.COR_CODIGO COR_ID,
    
                    (SELECT FIRST 1 C.DESCRICAO
                       FROM TBCOR C
                      WHERE C.CODIGO = P.COR_CODIGO) COR_DESCRICAO,
    
                    COALESCE(B.TAMANHO_ID,0) TAMANHO_ID,
                    COALESCE((SELECT FIRST 1 TAM_DESCRICAO
                       FROM SP_TAMANHO_GRADE(P.GRADE_CODIGO,B.TAMANHO_ID)),'') TAMANHO,

                    P.UNIDADEMEDIDA_SIGLA UM,
                    P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
            
                    COALESCE(CAST(
                        (SELECT FIRST 1 SUM(S.PROJECAO)
                           FROM TMP10168_1 S
                          WHERE S.PRODUTO_ID = P.CODIGO) AS NUMERIC(15,4)),0.0000) PROJECAO,
                
                    COALESCE(CAST(
                        (SELECT FIRST 1 SUM(S.SALDO)
                           FROM TBESTOQUE_SALDO S, TBLOCALIZACAO L
                          WHERE S.PRODUTO_CODIGO         = P.CODIGO
                            AND S.LOCALIZACAO_CODIGO = L.CODIGO
                            AND (S.LOCALIZACAO_CODIGO    = P.LOCALIZACAO_CODIGO or (L.CODIGO = S.LOCALIZACAO_CODIGO AND L.WIP = '1'))
                            AND S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) AS NUMERIC(15,4)),0.0000) ESTOQUE,

                    COALESCE(CAST(
                        (SELECT CAST(SUM(E.CONSUMO_KG-COALESCE(E.QUANTIDADE_CONFERENCIA,0)) AS NUMERIC(15,4))
                           FROM TBREMESSA_CONSUMO E
                          WHERE E.PRODUTO_ID  = P.CODIGO
                            AND E.CONFERENCIA = '0'
                            and Coalesce(E.Componente,'0') = '0'
                            AND E.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                   --         AND E.LOCALIZACAO_ID = P.LOCALIZACAO_CODIGO
                            AND E.REMESSA >= -1) AS NUMERIC(15,4)),0.0000)  EMPENHADO,
        
                    COALESCE(CAST(
                        (SELECT SUM(PG.QUANTIDADE)
                           FROM TBPROGRAMACAO PG
                          WHERE PG.PRODUTO_ID         = P.CODIGO
                            AND PG.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                            AND PG.TIPO              IN ('A','D')
                            AND PG.STATUS            IN ('0','1','2')) AS NUMERIC(15,4)),0.0000)  EM_PRODUCAO,
            
                    COALESCE(CAST(B.ESTOQUE_MIN * (COALESCE(B.PONTO_REPOSICAO,100.0000) / 100.0000) AS NUMERIC(15,4)),0.0000) QUANTIDADE_PONTO_REPOSICAO,
                    COALESCE(B.ESTOQUE_MIN,0.0000) ESTOQUE_MINIMO,
                    COALESCE(B.PONTO_REPOSICAO,0.0000) PONTO_REPOSICAO,
                    COALESCE(B.ESTOQUE_MAX,0.0000) ESTOQUE_MAXIMO,
                    COALESCE(B.TIPO_REPOSICAO,'1') TIPO_REPOSICAO,
                    COALESCE(P.SEGURANCA,0.00) / 100.00 SEGURANCA
            
                FROM TBPRODUTO P LEFT JOIN
                    (
                    SELECT M00.ESTABELECIMENTO_CODIGO, M00.PRODUTO_CODIGO, M00.LOCALIZACAO_CODIGO, M00.ESTOQUE_SEGURANCA, 00 TAMANHO_ID, M00.QUANTIDADE ESTOQUE_MIN, M00.SEGURANCA, M00.ESTOQUE_MAX ESTOQUE_MAX, M00.PONTO_REPOSICAO, M00.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M00, TBPRODUTO P WHERE P.CODIGO = M00.PRODUTO_CODIGO AND P.GRADE_CODIGO = 0 AND (M00.QUANTIDADE > 0 OR M00.ESTOQUE_MAX > 0) UNION
                    SELECT M01.ESTABELECIMENTO_CODIGO, M01.PRODUTO_CODIGO, M01.LOCALIZACAO_CODIGO, M01.ESTOQUE_SEGURANCA, 01 TAMANHO_ID, T01            ESTOQUE_MIN, M01.SEGURANCA, M01             ESTOQUE_MAX, M01.PONTO_REPOSICAO, M01.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M01, TBPRODUTO P WHERE P.CODIGO = M01.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M01.T01        > 0 OR M01.M01         > 0) UNION
                    SELECT M02.ESTABELECIMENTO_CODIGO, M02.PRODUTO_CODIGO, M02.LOCALIZACAO_CODIGO, M02.ESTOQUE_SEGURANCA, 02 TAMANHO_ID, T02            ESTOQUE_MIN, M02.SEGURANCA, M02             ESTOQUE_MAX, M02.PONTO_REPOSICAO, M02.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M02, TBPRODUTO P WHERE P.CODIGO = M02.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M02.T02        > 0 OR M02.M02         > 0) UNION
                    SELECT M03.ESTABELECIMENTO_CODIGO, M03.PRODUTO_CODIGO, M03.LOCALIZACAO_CODIGO, M03.ESTOQUE_SEGURANCA, 03 TAMANHO_ID, T03            ESTOQUE_MIN, M03.SEGURANCA, M03             ESTOQUE_MAX, M03.PONTO_REPOSICAO, M03.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M03, TBPRODUTO P WHERE P.CODIGO = M03.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M03.T03        > 0 OR M03.M03         > 0) UNION
                    SELECT M04.ESTABELECIMENTO_CODIGO, M04.PRODUTO_CODIGO, M04.LOCALIZACAO_CODIGO, M04.ESTOQUE_SEGURANCA, 04 TAMANHO_ID, T04            ESTOQUE_MIN, M04.SEGURANCA, M04             ESTOQUE_MAX, M04.PONTO_REPOSICAO, M04.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M04, TBPRODUTO P WHERE P.CODIGO = M04.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M04.T04        > 0 OR M04.M04         > 0) UNION
                    SELECT M05.ESTABELECIMENTO_CODIGO, M05.PRODUTO_CODIGO, M05.LOCALIZACAO_CODIGO, M05.ESTOQUE_SEGURANCA, 05 TAMANHO_ID, T05            ESTOQUE_MIN, M05.SEGURANCA, M05             ESTOQUE_MAX, M05.PONTO_REPOSICAO, M05.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M05, TBPRODUTO P WHERE P.CODIGO = M05.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M05.T05        > 0 OR M05.M05         > 0) UNION
                    SELECT M06.ESTABELECIMENTO_CODIGO, M06.PRODUTO_CODIGO, M06.LOCALIZACAO_CODIGO, M06.ESTOQUE_SEGURANCA, 06 TAMANHO_ID, T06            ESTOQUE_MIN, M06.SEGURANCA, M06             ESTOQUE_MAX, M06.PONTO_REPOSICAO, M06.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M06, TBPRODUTO P WHERE P.CODIGO = M06.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M06.T06        > 0 OR M06.M06         > 0) UNION
                    SELECT M07.ESTABELECIMENTO_CODIGO, M07.PRODUTO_CODIGO, M07.LOCALIZACAO_CODIGO, M07.ESTOQUE_SEGURANCA, 07 TAMANHO_ID, T07            ESTOQUE_MIN, M07.SEGURANCA, M07             ESTOQUE_MAX, M07.PONTO_REPOSICAO, M07.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M07, TBPRODUTO P WHERE P.CODIGO = M07.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M07.T07        > 0 OR M07.M07         > 0) UNION
                    SELECT M08.ESTABELECIMENTO_CODIGO, M08.PRODUTO_CODIGO, M08.LOCALIZACAO_CODIGO, M08.ESTOQUE_SEGURANCA, 08 TAMANHO_ID, T08            ESTOQUE_MIN, M08.SEGURANCA, M08             ESTOQUE_MAX, M08.PONTO_REPOSICAO, M08.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M08, TBPRODUTO P WHERE P.CODIGO = M08.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M08.T08        > 0 OR M08.M08         > 0) UNION
                    SELECT M09.ESTABELECIMENTO_CODIGO, M09.PRODUTO_CODIGO, M09.LOCALIZACAO_CODIGO, M09.ESTOQUE_SEGURANCA, 09 TAMANHO_ID, T09            ESTOQUE_MIN, M09.SEGURANCA, M09             ESTOQUE_MAX, M09.PONTO_REPOSICAO, M09.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M09, TBPRODUTO P WHERE P.CODIGO = M09.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M09.T09        > 0 OR M09.M09         > 0) UNION
                    SELECT M10.ESTABELECIMENTO_CODIGO, M10.PRODUTO_CODIGO, M10.LOCALIZACAO_CODIGO, M10.ESTOQUE_SEGURANCA, 10 TAMANHO_ID, T10            ESTOQUE_MIN, M10.SEGURANCA, M10             ESTOQUE_MAX, M10.PONTO_REPOSICAO, M10.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M10, TBPRODUTO P WHERE P.CODIGO = M10.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M10.T10        > 0 OR M10.M10         > 0) UNION
                    SELECT M11.ESTABELECIMENTO_CODIGO, M11.PRODUTO_CODIGO, M11.LOCALIZACAO_CODIGO, M11.ESTOQUE_SEGURANCA, 11 TAMANHO_ID, T11            ESTOQUE_MIN, M11.SEGURANCA, M11             ESTOQUE_MAX, M11.PONTO_REPOSICAO, M11.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M11, TBPRODUTO P WHERE P.CODIGO = M11.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M11.T11        > 0 OR M11.M11         > 0) UNION
                    SELECT M12.ESTABELECIMENTO_CODIGO, M12.PRODUTO_CODIGO, M12.LOCALIZACAO_CODIGO, M12.ESTOQUE_SEGURANCA, 12 TAMANHO_ID, T12            ESTOQUE_MIN, M12.SEGURANCA, M12             ESTOQUE_MAX, M12.PONTO_REPOSICAO, M12.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M12, TBPRODUTO P WHERE P.CODIGO = M12.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M12.T12        > 0 OR M12.M12         > 0) UNION
                    SELECT M13.ESTABELECIMENTO_CODIGO, M13.PRODUTO_CODIGO, M13.LOCALIZACAO_CODIGO, M13.ESTOQUE_SEGURANCA, 13 TAMANHO_ID, T13            ESTOQUE_MIN, M13.SEGURANCA, M13             ESTOQUE_MAX, M13.PONTO_REPOSICAO, M13.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M13, TBPRODUTO P WHERE P.CODIGO = M13.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M13.T13        > 0 OR M13.M13         > 0) UNION
                    SELECT M14.ESTABELECIMENTO_CODIGO, M14.PRODUTO_CODIGO, M14.LOCALIZACAO_CODIGO, M14.ESTOQUE_SEGURANCA, 14 TAMANHO_ID, T14            ESTOQUE_MIN, M14.SEGURANCA, M14             ESTOQUE_MAX, M14.PONTO_REPOSICAO, M14.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M14, TBPRODUTO P WHERE P.CODIGO = M14.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M14.T14        > 0 OR M14.M14         > 0) UNION
                    SELECT M15.ESTABELECIMENTO_CODIGO, M15.PRODUTO_CODIGO, M15.LOCALIZACAO_CODIGO, M15.ESTOQUE_SEGURANCA, 15 TAMANHO_ID, T15            ESTOQUE_MIN, M15.SEGURANCA, M15             ESTOQUE_MAX, M15.PONTO_REPOSICAO, M15.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M15, TBPRODUTO P WHERE P.CODIGO = M15.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M15.T15        > 0 OR M15.M15         > 0) UNION
                    SELECT M16.ESTABELECIMENTO_CODIGO, M16.PRODUTO_CODIGO, M16.LOCALIZACAO_CODIGO, M16.ESTOQUE_SEGURANCA, 16 TAMANHO_ID, T16            ESTOQUE_MIN, M16.SEGURANCA, M16             ESTOQUE_MAX, M16.PONTO_REPOSICAO, M16.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M16, TBPRODUTO P WHERE P.CODIGO = M16.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M16.T16        > 0 OR M16.M16         > 0) UNION
                    SELECT M17.ESTABELECIMENTO_CODIGO, M17.PRODUTO_CODIGO, M17.LOCALIZACAO_CODIGO, M17.ESTOQUE_SEGURANCA, 17 TAMANHO_ID, T17            ESTOQUE_MIN, M17.SEGURANCA, M17             ESTOQUE_MAX, M17.PONTO_REPOSICAO, M17.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M17, TBPRODUTO P WHERE P.CODIGO = M17.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M17.T17        > 0 OR M17.M17         > 0) UNION
                    SELECT M18.ESTABELECIMENTO_CODIGO, M18.PRODUTO_CODIGO, M18.LOCALIZACAO_CODIGO, M18.ESTOQUE_SEGURANCA, 18 TAMANHO_ID, T18            ESTOQUE_MIN, M18.SEGURANCA, M18             ESTOQUE_MAX, M18.PONTO_REPOSICAO, M18.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M18, TBPRODUTO P WHERE P.CODIGO = M18.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M18.T18        > 0 OR M18.M18         > 0) UNION
                    SELECT M19.ESTABELECIMENTO_CODIGO, M19.PRODUTO_CODIGO, M19.LOCALIZACAO_CODIGO, M19.ESTOQUE_SEGURANCA, 19 TAMANHO_ID, T19            ESTOQUE_MIN, M19.SEGURANCA, M19             ESTOQUE_MAX, M19.PONTO_REPOSICAO, M19.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M19, TBPRODUTO P WHERE P.CODIGO = M19.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M19.T19        > 0 OR M19.M19         > 0) UNION
                    SELECT M20.ESTABELECIMENTO_CODIGO, M20.PRODUTO_CODIGO, M20.LOCALIZACAO_CODIGO, M20.ESTOQUE_SEGURANCA, 20 TAMANHO_ID, T20            ESTOQUE_MIN, M20.SEGURANCA, M20             ESTOQUE_MAX, M20.PONTO_REPOSICAO, M20.TIPO_REPOSICAO FROM TBESTOQUE_MINIMO M20, TBPRODUTO P WHERE P.CODIGO = M20.PRODUTO_CODIGO AND P.GRADE_CODIGO > 0 AND (M20.T20        > 0 OR M20.M20         > 0)
                    ) B ON
                        B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                    AND B.LOCALIZACAO_CODIGO     = P.LOCALIZACAO_CODIGO
                    AND B.PRODUTO_CODIGO         = P.CODIGO
                    AND B.ESTOQUE_MIN > 0
    
                WHERE P.FAMILIA_CODIGO = :FAMILIA_1
                AND P.STATUS           = '1'
                ) X
            ) V
    
  --      WHERE V.NECESSIDADE > 0

    INTO
        :XPRODUTO_ID,
        :XMODELO_ID,
        :XMODELO_DESCRICAO,
        :XCOR_ID,
        :XCOR_DESCRICAO,
        :XTAMANHO_ID,
        :XTAMANHO,
        :XUM,
        :XLOCALIZACAO_ID,
        :XESTOQUE,
        :XEM_PRODUCAO,
        :XEMPENHADO,
        :XPROJECAO,
        :XEST_MIN,
        :XEST_MAX,
        :XSEGURANCA,
        :XPERC_PONTO_REP,
        :XQTD_PONTO_REP,
        :XTIPO_REP,
        :XQTD_REP,
        :XNECESSIDADE,
        :XDENSIDADE,
        :XESPESSURA

    DO
    BEGIN
        IF (:XPRODUTO_ID > 0) THEN
        BEGIN
            PRODUTO_ID       = :XPRODUTO_ID ;
            MODELO_ID        = :XMODELO_ID;
            MODELO_DESCRICAO = :XMODELO_DESCRICAO;
            COR_ID           = :XCOR_ID;
            COR_DESCRICAO    = :XCOR_DESCRICAO;
            TAMANHO_ID       = :XTAMANHO_ID;
            TAMANHO          = :XTAMANHO;
            UM               = :XUM;
            LOCALIZACAO_ID   = :XLOCALIZACAO_ID ;
            ESTOQUE          = :XESTOQUE ;
            EMPENHADO        = :XEMPENHADO ;
            EM_PRODUCAO      = :XEM_PRODUCAO ;
            PROJECAO         = :XPROJECAO ;
            EST_MIN          = :XEST_MIN ;
            EST_MAX          = :XEST_MAX ;
            SEGURANCA        = :XSEGURANCA ;
            PERC_PONTO_REP   = :XPERC_PONTO_REP ;
            QTD_PONTO_REP    = :XQTD_PONTO_REP ;
            TIPO_REP         = :XTIPO_REP ;
            QTD_REP          = :XQTD_REP ;
            NECESSIDADE      = :XNECESSIDADE ;
            PROGRAMAR        = (SELECT VALOR2 FROM ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            DENSIDADE        = :XDENSIDADE;
            ESPESSURA        = :XESPESSURA;
            FILTRO           = :PRODUTO_ID||' '||:MODELO_ID||' '||:MODELO_DESCRICAO||' '||:COR_DESCRICAO||' '||:TAMANHO;
            SUSPEND;
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROJECAO_REMESSA1 (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    I_PRODUTO_ID integer = null,
    I_TAMANHO integer = null)
returns (
    PRODUTO_ID integer,
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(50),
    COR_ID integer,
    COR_DESCRICAO varchar(20),
    UM varchar(10),
    TAMANHO_ID integer,
    TAMANHO varchar(10),
    LOCALIZACAO_ID integer,
    ESTOQUE numeric(18,4),
    EMPENHADO numeric(18,4),
    PEDIDO numeric(18,4),
    EM_PRODUCAO numeric(18,4),
    EST_MIN numeric(18,4),
    EST_MAX numeric(18,4),
    SEGURANCA numeric(18,4),
    PERC_PONTO_REP numeric(18,4),
    QTD_PONTO_REP numeric(18,4),
    TIPO_REP char(12),
    QTD_REP numeric(18,4),
    NECESSIDADE numeric(18,4),
    PROGRAMAR numeric(18,4),
    DENSIDADE integer,
    ESPESSURA numeric(18,4),
    FILTRO varchar(500))
as
declare variable YMODELO_ID integer;
declare variable YCOR_ID integer;
declare variable YTAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable VPRODUTO_ID integer;
declare variable VTAM integer;
declare variable VPROJECAO numeric(15,4);
declare variable XPRODUTO_ID integer;
declare variable XMODELO_ID integer;
declare variable XMODELO_DESCRICAO varchar(50);
declare variable XCOR_ID integer;
declare variable XCOR_DESCRICAO varchar(20);
declare variable XTAMANHO_ID integer;
declare variable XTAMANHO varchar(10);
declare variable XUM varchar(3);
declare variable XLOCALIZACAO_ID integer;
declare variable XESTOQUE numeric(18,4);
declare variable XEMPENHADO numeric(18,4);
declare variable XPEDIDO numeric(18,4);
declare variable XEM_PRODUCAO numeric(18,4);
declare variable XEST_MIN numeric(18,4);
declare variable XEST_MAX numeric(18,4);
declare variable XSEGURANCA numeric(18,4);
declare variable XPERC_PONTO_REP numeric(18,4);
declare variable XQTD_PONTO_REP numeric(18,4);
declare variable XTIPO_REP char(12);
declare variable XQTD_REP numeric(18,4);
declare variable XNECESSIDADE numeric(18,4);
declare variable XDENSIDADE integer;
declare variable XESPESSURA numeric(18,4);
BEGIN

    FOR
        SELECT
            Y.PRODUTO_ID,
            Y.MODELO_ID,
            Y.MODELO_DESCRICAO,
            Y.DENSIDADE,
            Y.ESPESSURA,
            Y.COR_ID,
            Y.COR_DESCRICAO,
            Y.TAMANHO_ID,
            Y.TAMANHO,
            Y.UM,
            Y.LOCALIZACAO_ID,
            Y.ESTOQUE,
       --     Y.ESTOQUE_WIP,
            Y.EMPENHADO,
            Y.PEDIDO,
            Y.EM_PRODUCAO,
            Y.SEGURANCA,
            Y.ESTOQUE_MINIMO,
            Y.ESTOQUE_MAXIMO,
            Y.PONTO_REPOSICAO,
            Y.QUANTIDADE_PONTO_REPOSICAO,
            Y.TIPO_REP,
            Y.QTD_REP,
            Y.NECESSIDADE

        FROM
            (SELECT
                X.PRODUTO_ID,
                X.MODELO_ID,
                X.MODELO_DESCRICAO,
                X.DENSIDADE,
                X.ESPESSURA,
                X.COR_ID,
                X.COR_DESCRICAO,
                X.TAMANHO_ID,
                X.TAMANHO,
                X.UM,
                X.LOCALIZACAO_ID,
                X.ESTOQUE,
        --        X.ESTOQUE_WIP,
                X.EMPENHADO,
                X.PEDIDO,
                X.EM_PRODUCAO,
                X.SEGURANCA,
                X.ESTOQUE_MINIMO,
                X.ESTOQUE_MAXIMO,
                X.PONTO_REPOSICAO,
                X.TIPO_REPOSICAO,
                X.QUANTIDADE_PONTO_REPOSICAO,
                IIF(X.TIPO_REPOSICAO='0','MIN','MAX') TIPO_REP,
            
                IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,
                    X.ESTOQUE_MINIMO,
                    X.ESTOQUE_MAXIMO) QTD_REP,
            
                IIF(X.ESTOQUE  + X.EM_PRODUCAO - X.EMPENHADO - X.PEDIDO < X.QUANTIDADE_PONTO_REPOSICAO,
                    IIF(X.TIPO_REPOSICAO='0' AND X.QUANTIDADE_PONTO_REPOSICAO <= X.ESTOQUE_MINIMO,
                        X.ESTOQUE_MINIMO,X.ESTOQUE_MAXIMO) - ( X.ESTOQUE  + X.EM_PRODUCAO - X.EMPENHADO - X.PEDIDO ), 0) NECESSIDADE
            FROM
                (SELECT
                    A.PRODUTO_ID,
                    A.MODELO_ID,
                    CAST(SUBSTRING(A.MODELO   FROM 01 FOR 50) AS   VARCHAR(50)) MODELO_DESCRICAO,

                    IIF( CAST(SUBSTRING(A.MODELO FROM 51 FOR 10) AS INTEGER) > 0, CAST(SUBSTRING(A.MODELO FROM 51 FOR 10) AS INTEGER), CAST(SUBSTRING(A.DENS_ESP FROM 01 FOR 05) AS       INTEGER)) DENSIDADE,

                    IIF( CAST(SUBSTRING(A.MODELO FROM 61 FOR 12) AS NUMERIC(10,1)) > 0, CAST(SUBSTRING(A.MODELO FROM 61 FOR 12) AS NUMERIC(10,1)), CAST(SUBSTRING(A.DENS_ESP FROM 06 FOR 10) AS NUMERIC(10,1))) ESPESSURA,

                    A.COR_ID,
                    A.COR_DESCRICAO,
                    A.TAMANHO_ID,
                    A.TAMANHO,
                    A.UM,
                    A.LOCALIZACAO_ID,
                    A.ESTOQUE,
          --          A.ESTOQUE_WIP,
                    A.EMPENHADO,
                    A.PEDIDO,
                    A.EM_PRODUCAO,
                    A.SEGURANCA,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 01 FOR 15),  0) AS NUMERIC(10,4)) ESTOQUE_MINIMO,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 16 FOR 15),  0) AS NUMERIC(10,4)) ESTOQUE_MAXIMO,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 31 FOR 12),100) AS       INTEGER) PONTO_REPOSICAO,
                    CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 43 FOR 05),'1') AS       CHAR(1)) TIPO_REPOSICAO,
                
                    CAST(
                    (CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 01 FOR 15),  0) AS NUMERIC(10,4)) *
                     CAST(COALESCE(SUBSTRING(A.REPOSICAO FROM 31 FOR 12),100) AS       INTEGER) / 100) AS NUMERIC(10,4)) QUANTIDADE_PONTO_REPOSICAO
                
                FROM
                    (SELECT
                        P.CODIGO PRODUTO_ID,
                        P.MODELO_CODIGO MODELO_ID,
                    
                        (SELECT FIRST 1 RPAD(COALESCE(M.DESCRICAO,''),50) || LPAD(COALESCE(M.DENSIDADE,0),10) || LPAD(COALESCE(M.ESPESSURA,0),12)
                           FROM TBMODELO M
                          WHERE M.CODIGO = P.MODELO_CODIGO) MODELO,

                        Coalesce((
                            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')
                              From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                             Where MC.Modelo_Id = P.MODELO_CODIGO
                               and MC.Cor_Id = P.COR_CODIGO
                               and MC.Produto_Id = P2.Codigo
                               and P2.Familia_Codigo = F.Codigo
                               and F.Densidade_Espessura = '1'
                               and((GS.TAMANHO = 1 and MC.T01 > 0) or
                                   (GS.TAMANHO = 2 and MC.T02 > 0) or
                                   (GS.TAMANHO = 3 and MC.T03 > 0) or
                                   (GS.TAMANHO = 4 and MC.T04 > 0) or
                                   (GS.TAMANHO = 5 and MC.T05 > 0) or
                                   (GS.TAMANHO = 6 and MC.T06 > 0) or
                                   (GS.TAMANHO = 7 and MC.T07 > 0) or
                                   (GS.TAMANHO = 8 and MC.T08 > 0) or
                                   (GS.TAMANHO = 9 and MC.T09 > 0) or
                                   (GS.TAMANHO =10 and MC.T10 > 0) or
                                   (GS.TAMANHO =11 and MC.T11 > 0) or
                                   (GS.TAMANHO =12 and MC.T12 > 0) or
                                   (GS.TAMANHO =13 and MC.T13 > 0) or
                                   (GS.TAMANHO =14 and MC.T14 > 0) or
                                   (GS.TAMANHO =15 and MC.T15 > 0) or
                                   (GS.TAMANHO =16 and MC.T16 > 0) or
                                   (GS.TAMANHO =17 and MC.T17 > 0) or
                                   (GS.TAMANHO =18 and MC.T18 > 0) or
                                   (GS.TAMANHO =19 and MC.T19 > 0) or
                                   (GS.TAMANHO =20 and MC.T20 > 0))),'0000000000') DENS_ESP,

                        P.COR_CODIGO COR_ID,
                    
                        (SELECT FIRST 1 C.DESCRICAO
                           FROM TBCOR C
                          WHERE C.CODIGO = P.COR_CODIGO) COR_DESCRICAO,
                    
                        COALESCE(GS.TAMANHO,0) TAMANHO_ID,
                    
                        COALESCE((SELECT FIRST 1 TAM_DESCRICAO
                                    FROM SP_TAMANHO_GRADE(P.GRADE_CODIGO,GS.TAMANHO)),'') TAMANHO,
                        
                        P.UNIDADEMEDIDA_SIGLA UM,
                        P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
                    
                        COALESCE(CAST(
                            (SELECT
                                IIF(GS.TAMANHO = 00, SUM(S.SALDO),
                                IIF(GS.TAMANHO = 01, SUM(S.T01_SALDO),
                                IIF(GS.TAMANHO = 02, SUM(S.T02_SALDO),
                                IIF(GS.TAMANHO = 03, SUM(S.T03_SALDO),
                                IIF(GS.TAMANHO = 04, SUM(S.T04_SALDO),
                                IIF(GS.TAMANHO = 05, SUM(S.T05_SALDO),
                                IIF(GS.TAMANHO = 06, SUM(S.T06_SALDO),
                                IIF(GS.TAMANHO = 07, SUM(S.T07_SALDO),
                                IIF(GS.TAMANHO = 08, SUM(S.T08_SALDO),
                                IIF(GS.TAMANHO = 09, SUM(S.T09_SALDO),
                                IIF(GS.TAMANHO = 10, SUM(S.T10_SALDO),
                                IIF(GS.TAMANHO = 11, SUM(S.T11_SALDO),
                                IIF(GS.TAMANHO = 12, SUM(S.T12_SALDO),
                                IIF(GS.TAMANHO = 13, SUM(S.T13_SALDO),
                                IIF(GS.TAMANHO = 14, SUM(S.T14_SALDO),
                                IIF(GS.TAMANHO = 15, SUM(S.T15_SALDO),
                                IIF(GS.TAMANHO = 16, SUM(S.T16_SALDO),
                                IIF(GS.TAMANHO = 17, SUM(S.T17_SALDO),
                                IIF(GS.TAMANHO = 18, SUM(S.T18_SALDO),
                                IIF(GS.TAMANHO = 19, SUM(S.T19_SALDO),
                                IIF(GS.TAMANHO = 20, SUM(S.T20_SALDO),0)))))))))))))))))))))
                    
                               FROM TBESTOQUE_SALDO S, TBLOCALIZACAO L
                              WHERE S.PRODUTO_CODIGO         = P.CODIGO
                                AND S.LOCALIZACAO_CODIGO     = L.CODIGO
                                AND (S.LOCALIZACAO_CODIGO    IN (SELECT OSPLIT FROM SPLIT(COALESCE(NULLIF(FN_PARAMETRO('TBFAMILIA.LOCALIZACAO_PADRAO',P.FAMILIA_CODIGO),'0'),P.LOCALIZACAO_CODIGO),',')) or (L.CODIGO = S.LOCALIZACAO_CODIGO AND L.WIP = '1'))
                                AND S.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1) AS NUMERIC(15,4)),0.0000) ESTOQUE,
                        /*
                        COALESCE((
                            SELECT SUM(SALDO)
                              FROM (
                                SELECT DISTINCT ES.*
                                  FROM VWESTOQUE_SALDO_PRODUTO ES,
                                       TBFAMILIA_LOCALIZACAO L
                                 WHERE P.CODIGO              = ES.PRODUTO_ID
                                   AND GS.TAMANHO            = ES.TAMANHO
                                   AND L.LOCALIZACAO_ID      = ES.LOCALIZACAO_ID
                                   AND P.FAMILIA_CODIGO      = L.FAMILIA_ID
                                   AND L.LOCALIZACAO_TIPO_ID = 5 -- WIP
                                   AND ES.PRODUTO_ID         = P.CODIGO) X),0)ESTOQUE_WIP,
                        */
                        COALESCE(CAST(
                            (SELECT CAST(SUM(E.CONSUMO_KG-COALESCE(E.QUANTIDADE_CONFERENCIA,0)) AS NUMERIC(15,4))
                               FROM TBREMESSA_CONSUMO E
                              WHERE E.PRODUTO_ID  = P.CODIGO
                                AND E.CONFERENCIA = '0'
                          --      AND COALESCE(E.COMPONENTE,'0') = '0'
                                AND E.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                          --    AND E.LOCALIZACAO_ID = P.LOCALIZACAO_CODIGO
                                AND E.TAMANHO = GS.TAMANHO
                                AND E.REMESSA >= -1) AS NUMERIC(15,4)),0.0000)  EMPENHADO,
                    
                        IIF(FN_PARAMETRO('TBFAMILIA.REPOR_PEDIDO',P.FAMILIA_CODIGO) = 0,0,
                        COALESCE(CAST(
                           (SELECT CAST(SUM(PIS.QUANTIDADE) AS NUMERIC(15,4))
                              FROM TBPEDIDO PE, TBPEDIDO_ITEM PI, TBPEDIDO_ITEM_SALDO PIS
                             WHERE PE.PEDIDO = PI.PEDIDO
                               AND PE.PEDIDO = PIS.PEDIDO
                               AND PI.CONTROLE = PIS.PEDIDO_ITEM_CONTROLE
                               AND PI.PRODUTO_CODIGO = P.CODIGO
                               AND PE.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                          --   AND PI.LOCALIZACAO_ID = P.LOCALIZACAO_CODIGO
                               AND PI.TAMANHO = GS.TAMANHO
                               AND PI.SITUACAO = 1
                               AND PE.STATUS = '1'
                               AND PE.SITUACAO = '1'
                               AND COALESCE(PE.REMESSA_ID,0) = 0) AS NUMERIC(15,4)),0.0000))  PEDIDO,

                        COALESCE(CAST(
                            (SELECT SUM(PG.QUANTIDADE)
                               FROM TBPROGRAMACAO PG LEFT JOIN TBPEDIDO PD ON PD.REMESSA_ID = PG.REMESSA_ID
                              WHERE PG.PRODUTO_ID = P.CODIGO
                                AND PG.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                                AND PG.TAMANHO = GS.TAMANHO
                                AND PG.TIPO IN ('A','D')
                                AND PG.STATUS IN ('0','1','2')
                                AND PD.REMESSA_ID IS NULL
                                ) AS NUMERIC(15,4)),0.0000)  EM_PRODUCAO,
                
                        COALESCE(P.SEGURANCA,0.00) / 100.00 SEGURANCA,
                    
                            (SELECT
                                LPAD(
                                IIF(GS.TAMANHO = 00, M00.QUANTIDADE,
                                IIF(GS.TAMANHO = 01, M00.T01,
                                IIF(GS.TAMANHO = 02, M00.T02,
                                IIF(GS.TAMANHO = 03, M00.T03,
                                IIF(GS.TAMANHO = 04, M00.T04,
                                IIF(GS.TAMANHO = 05, M00.T05,
                                IIF(GS.TAMANHO = 06, M00.T06,
                                IIF(GS.TAMANHO = 07, M00.T07,
                                IIF(GS.TAMANHO = 08, M00.T08,
                                IIF(GS.TAMANHO = 09, M00.T09,
                                IIF(GS.TAMANHO = 10, M00.T10,
                                IIF(GS.TAMANHO = 11, M00.T11,
                                IIF(GS.TAMANHO = 12, M00.T12,
                                IIF(GS.TAMANHO = 13, M00.T13,
                                IIF(GS.TAMANHO = 14, M00.T14,
                                IIF(GS.TAMANHO = 15, M00.T15,
                                IIF(GS.TAMANHO = 16, M00.T16,
                                IIF(GS.TAMANHO = 17, M00.T17,
                                IIF(GS.TAMANHO = 18, M00.T18,
                                IIF(GS.TAMANHO = 19, M00.T19,
                                IIF(GS.TAMANHO = 20, M00.T20,0))))))))))))))))))))),15)||
                    
                                LPAD(
                                IIF(GS.TAMANHO = 00, M00.ESTOQUE_MAX,
                                IIF(GS.TAMANHO = 01, M00.M01,
                                IIF(GS.TAMANHO = 02, M00.M02,
                                IIF(GS.TAMANHO = 03, M00.M03,
                                IIF(GS.TAMANHO = 04, M00.M04,
                                IIF(GS.TAMANHO = 05, M00.M05,
                                IIF(GS.TAMANHO = 06, M00.M06,
                                IIF(GS.TAMANHO = 07, M00.M07,
                                IIF(GS.TAMANHO = 08, M00.M08,
                                IIF(GS.TAMANHO = 09, M00.M09,
                                IIF(GS.TAMANHO = 10, M00.M10,
                                IIF(GS.TAMANHO = 11, M00.M11,
                                IIF(GS.TAMANHO = 12, M00.M12,
                                IIF(GS.TAMANHO = 13, M00.M13,
                                IIF(GS.TAMANHO = 14, M00.M14,
                                IIF(GS.TAMANHO = 15, M00.M15,
                                IIF(GS.TAMANHO = 16, M00.M16,
                                IIF(GS.TAMANHO = 17, M00.M17,
                                IIF(GS.TAMANHO = 18, M00.M18,
                                IIF(GS.TAMANHO = 19, M00.M19,
                                IIF(GS.TAMANHO = 20, M00.M20,0))))))))))))))))))))),15)||
                    
                               LPAD(COALESCE(M00.PONTO_REPOSICAO,100),12) ||
                               RPAD(COALESCE(M00.TIPO_REPOSICAO,'1' ), 5)
                    
                          FROM TBESTOQUE_MINIMO M00
                         WHERE P.CODIGO = M00.PRODUTO_CODIGO
                           AND M00.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
                           AND M00.LOCALIZACAO_CODIGO = P.LOCALIZACAO_CODIGO)REPOSICAO
                    
                    FROM TBPRODUTO P, TBGRADE_SEQ GS--, tbmodelo m
                    
                    WHERE
                        P.FAMILIA_CODIGO = :FAMILIA_1

                    --and p.modelo_codigo = m.codigo
                    /*
                    and (
                        (gs.tamanho = 1 and m.t01 = '1') or
                        (gs.tamanho = 2 and m.t02 = '1') or
                        (gs.tamanho = 3 and m.t03 = '1') or
                        (gs.tamanho = 4 and m.t04 = '1') or
                        (gs.tamanho = 5 and m.t05 = '1') or
                        (gs.tamanho = 6 and m.t06 = '1') or
                        (gs.tamanho = 7 and m.t07 = '1') or
                        (gs.tamanho = 8 and m.t08 = '1') or
                        (gs.tamanho = 9 and m.t09 = '1') or
                        (gs.tamanho =10 and m.t10 = '1') or
                        (gs.tamanho =11 and m.t11 = '1') or
                        (gs.tamanho =12 and m.t12 = '1') or
                        (gs.tamanho =13 and m.t13 = '1') or
                        (gs.tamanho =14 and m.t14 = '1') or
                        (gs.tamanho =15 and m.t15 = '1') or
                        (gs.tamanho =16 and m.t16 = '1') or
                        (gs.tamanho =17 and m.t17 = '1') or
                        (gs.tamanho =18 and m.t18 = '1') or
                        (gs.tamanho =19 and m.t19 = '1') or
                        (gs.tamanho =20 and m.t20 = '1')
                    )
                    */
                    AND P.STATUS           = '1'
                    AND IIF(:I_PRODUTO_ID IS NOT NULL,P.CODIGO = :I_PRODUTO_ID,TRUE)
                    AND IIF(:I_TAMANHO IS NOT NULL,GS.TAMANHO = :I_TAMANHO,TRUE)
                    AND ( (P.GRADE_CODIGO > 0 AND GS.TAMANHO > 0) OR (COALESCE(P.GRADE_CODIGO,0) = 0 AND COALESCE(GS.TAMANHO,0) = 0) )
                    )A
                )X
            )Y
        WHERE
            Y.NECESSIDADE > 0
    INTO

        :XPRODUTO_ID,
        :XMODELO_ID,
        :XMODELO_DESCRICAO,
        :XDENSIDADE,
        :XESPESSURA,
        :XCOR_ID,
        :XCOR_DESCRICAO,
        :XTAMANHO_ID,
        :XTAMANHO,
        :XUM,
        :XLOCALIZACAO_ID,
        :XESTOQUE,
     --   :XESTOQUE_WIP,
        :XEMPENHADO,
        :XPEDIDO,
        :XEM_PRODUCAO,
        :XSEGURANCA,
        :XEST_MIN,
        :XEST_MAX,
        :XPERC_PONTO_REP,
        :XQTD_PONTO_REP,
        :XTIPO_REP,
        :XQTD_REP,
        :XNECESSIDADE



    DO
    BEGIN
        IF (:XPRODUTO_ID > 0) THEN
        BEGIN
            PRODUTO_ID       = :XPRODUTO_ID ;
            MODELO_ID        = :XMODELO_ID;
            MODELO_DESCRICAO = :XMODELO_DESCRICAO;
            COR_ID           = :XCOR_ID;
            COR_DESCRICAO    = :XCOR_DESCRICAO;
            TAMANHO_ID       = :XTAMANHO_ID;
            TAMANHO          = :XTAMANHO;
            UM               = :XUM;
            LOCALIZACAO_ID   = :XLOCALIZACAO_ID ;
            ESTOQUE          = :XESTOQUE ;
     --       ESTOQUE_WIP      = :XESTOQUE_WIP ;
            EMPENHADO        = :XEMPENHADO ;
            PEDIDO           = :XPEDIDO ;
            EM_PRODUCAO      = :XEM_PRODUCAO ;
            EST_MIN          = :XEST_MIN ;
            EST_MAX          = :XEST_MAX ;
            SEGURANCA        = :XSEGURANCA ;
            PERC_PONTO_REP   = :XPERC_PONTO_REP ;
            QTD_PONTO_REP    = :XQTD_PONTO_REP ;
            TIPO_REP         = :XTIPO_REP ;
            QTD_REP          = :XQTD_REP ;
            NECESSIDADE      = :XNECESSIDADE ;
            PROGRAMAR        = (SELECT VALOR2 FROM ARREDONDAR_PRA_CIMA(:XNECESSIDADE));
            DENSIDADE        = :XDENSIDADE;
            ESPESSURA        = :XESPESSURA;
            FILTRO           = :PRODUTO_ID||' '||:MODELO_ID||' '||:MODELO_DESCRICAO||' '||:COR_DESCRICAO||' '||:TAMANHO;
            SUSPEND;
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE (
    ESTABELECIMENTO_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    TIPO_1 char(1),
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(11),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UNIDADEMEDIDA_SIGLA,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Quantidade *
       (Select B.Custo_Medio From TbEstoque_Saldo_Diario B Where
              (A.Produto_Codigo         = B.Produto_Codigo
           and A.Estabelecimento_Codigo = B.Estabelecimento_Codigo
           and A.Localizacao_Codigo     = B.Localizacao_Codigo
           and A.Data                   = B.Data)))
From   TbEstoque_Transacao_Item  A, TbProduto C
Where   A.Produto_Codigo = C.Codigo
  and ((A.Nfe_Item_Controle = 0) or (A.Nfe_Item_Controle is null)
  and  (A.Nfs_Item_Controle = 0) or (A.Nfs_Item_Controle is null))

  and (A.Tipo = :TIPO_1)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Data between :DATA_1 and :DATA_2)

  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1

  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UNIDADEMEDIDA_SIGLA, C.Familia_Codigo

Order By 6 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFE_QTD (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UNIDADEMEDIDA_SIGLA,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From   TbNfe_Item  A, TbProduto   C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Entrada between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UNIDADEMEDIDA_SIGLA, C.Familia_Codigo

Order By 6 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFE_VLR (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UNIDADEMEDIDA_SIGLA,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From      TbNfe_Item  A, TbProduto C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Entrada between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UNIDADEMEDIDA_SIGLA, C.Familia_Codigo

Order By 7 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFS_QTD (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UNIDADEMEDIDA_SIGLA,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From      TbNfs_Item A, TbProduto C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Emissao between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UNIDADEMEDIDA_SIGLA, C.Familia_Codigo

Order By 6 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_NFS_VLR (
    ESTABELECIMENTO_CODIGO_1 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UNIDADEMEDIDA_SIGLA,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Valor_Total)

From      TbNfs_Item  A, TbProduto  C
Where  A.Produto_Codigo = C.Codigo
  and (A.Situacao < 3 and A.Produto_Codigo > 0)
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1
  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)
  and (A.Empresa_Codigo     > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo     = :EMPRESA_CODIGO_1)
  and (A.Data_Emissao between :DATA_1 and :DATA_2)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UNIDADEMEDIDA_SIGLA, C.Familia_Codigo

Order By 7 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_ABC_ESTOQUE_VLR (
    ESTABELECIMENTO_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    TIPO_1 char(1),
    PRODUTO_CODIGO_1 integer,
    PRODUTO_CODIGO_2 integer,
    LOCALIZACAO_CODIGO_T integer,
    LOCALIZACAO_CODIGO_1 integer,
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer,
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3))
returns (
    ESTABELECIMENTO_CODIGO integer,
    PRODUTO_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    FAMILIA_CODIGO integer,
    QUANTIDADE numeric(10,5),
    TOTAL numeric(10,5))
as
BEGIN
FOR Select A.Estabelecimento_Codigo,
       A.Produto_Codigo,
       C.Descricao, C.UNIDADEMEDIDA_SIGLA,
       C.Familia_Codigo,
       Sum(A.Quantidade),
       Sum(A.Quantidade *
       (Select B.Custo_Medio From TbEstoque_Saldo_Diario B Where
              (A.Produto_Codigo         = B.Produto_Codigo
           and A.Estabelecimento_Codigo = B.Estabelecimento_Codigo
           and A.Localizacao_Codigo     = B.Localizacao_Codigo
           and A.Data                   = B.Data)))
From   TbEstoque_Transacao_Item  A, TbProduto C
Where   A.Produto_Codigo = C.Codigo
  and ((A.Nfe_Item_Controle = 0) or (A.Nfe_Item_Controle is null)
  and  (A.Nfs_Item_Controle = 0) or (A.Nfs_Item_Controle is null))

  and (A.Tipo = :TIPO_1)

  and (C.Familia_Codigo > :FAMILIA_CODIGO_T or
       C.Familia_Codigo = :FAMILIA_CODIGO_1 or
       C.Familia_Codigo = :FAMILIA_CODIGO_2 or
       C.Familia_Codigo = :FAMILIA_CODIGO_3 or
       C.Familia_Codigo = :FAMILIA_CODIGO_4 or
       C.Familia_Codigo = :FAMILIA_CODIGO_5 or
       C.Familia_Codigo = :FAMILIA_CODIGO_6 or
       C.Familia_Codigo = :FAMILIA_CODIGO_7 or
       C.Familia_Codigo = :FAMILIA_CODIGO_8 or
       C.Familia_Codigo = :FAMILIA_CODIGO_9 or
       C.Familia_Codigo = :FAMILIA_CODIGO_10)

  and (A.Data between :DATA_1 and :DATA_2)

  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1

  and (A.Localizacao_Codigo > :LOCALIZACAO_CODIGO_T or
       A.Localizacao_Codigo = :LOCALIZACAO_CODIGO_1)
  and (A.Produto_Codigo BetWeen :PRODUTO_CODIGO_1 AND :PRODUTO_CODIGO_2)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

Group By A.Estabelecimento_Codigo, A.Produto_Codigo,
         C.Descricao, C.UNIDADEMEDIDA_SIGLA, C.Familia_Codigo

Order By 7 Desc

INTO
   :Estabelecimento_Codigo,
   :Produto_Codigo,
   :Descricao,
   :UnidadeMedida_Sigla,
   :Familia_Codigo,
   :Quantidade,
   :Total
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_FICHA2 (
    REMESSA_1 integer,
    REMESSA_2 integer)
returns (
    PRODUTO_CODIGO integer,
    GRADE_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    QUANTIDADE_TOTAL numeric(10,5),
    R_TOTAL numeric(10,5),
    T01 numeric(10,5),
    R01 numeric(10,5),
    T02 numeric(10,5),
    R02 numeric(10,5),
    T03 numeric(10,5),
    R03 numeric(10,5),
    T04 numeric(10,5),
    R04 numeric(10,5),
    T05 numeric(10,5),
    R05 numeric(10,5),
    T06 numeric(10,5),
    R06 numeric(10,5),
    T07 numeric(10,5),
    R07 numeric(10,5),
    T08 numeric(10,5),
    R08 numeric(10,5),
    T09 numeric(10,5),
    R09 numeric(10,5),
    T10 numeric(10,5),
    R10 numeric(10,5),
    T11 numeric(10,5),
    R11 numeric(10,5),
    T12 numeric(10,5),
    R12 numeric(10,5),
    T13 numeric(10,5),
    R13 numeric(10,5),
    T14 numeric(10,5),
    R14 numeric(10,5),
    T15 numeric(10,5),
    R15 numeric(10,5),
    T16 numeric(10,5),
    R16 numeric(10,5),
    T17 numeric(10,5),
    R17 numeric(10,5),
    T18 numeric(10,5),
    R18 numeric(10,5),
    T19 numeric(10,5),
    R19 numeric(10,5),
    T20 numeric(10,5),
    R20 numeric(10,5))
as
BEGIN
FOR  SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_CODIGO, F.GRADE_CODIGO,
 Max((SELECT D.DESCRICAO FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) DESCRICAO,
 Max((SELECT D.UNIDADEMEDIDA_SIGLA FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) UNIDADEMEDIDA_SIGLA,
 Sum(A.QUANTIDADE_PEDIDO) QUANTIDADE_TOTAL,
 MAX(B.CONSUMO_QUANTIDADE) R_TOTAL,
 SUM(CASE WHEN A.TAMANHO =  1 AND B.CONSUMO_QUANTIDADE_T01 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T01, MAX(B.CONSUMO_QUANTIDADE_T01) R01,
 SUM(CASE WHEN A.TAMANHO =  2 AND B.CONSUMO_QUANTIDADE_T02 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T02, MAX(B.CONSUMO_QUANTIDADE_T02) R02,
 SUM(CASE WHEN A.TAMANHO =  3 AND B.CONSUMO_QUANTIDADE_T03 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T03, MAX(B.CONSUMO_QUANTIDADE_T03) R03,
 SUM(CASE WHEN A.TAMANHO =  4 AND B.CONSUMO_QUANTIDADE_T04 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T04, MAX(B.CONSUMO_QUANTIDADE_T04) R04,
 SUM(CASE WHEN A.TAMANHO =  5 AND B.CONSUMO_QUANTIDADE_T05 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T05, MAX(B.CONSUMO_QUANTIDADE_T05) R05,
 SUM(CASE WHEN A.TAMANHO =  6 AND B.CONSUMO_QUANTIDADE_T06 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T06, MAX(B.CONSUMO_QUANTIDADE_T06) R06,
 SUM(CASE WHEN A.TAMANHO =  7 AND B.CONSUMO_QUANTIDADE_T07 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T07, MAX(B.CONSUMO_QUANTIDADE_T07) R07,
 SUM(CASE WHEN A.TAMANHO =  8 AND B.CONSUMO_QUANTIDADE_T08 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T08, MAX(B.CONSUMO_QUANTIDADE_T08) R08,
 SUM(CASE WHEN A.TAMANHO =  9 AND B.CONSUMO_QUANTIDADE_T09 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T09, MAX(B.CONSUMO_QUANTIDADE_T09) R09,
 SUM(CASE WHEN A.TAMANHO = 10 AND B.CONSUMO_QUANTIDADE_T10 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T10, MAX(B.CONSUMO_QUANTIDADE_T10) R10,
 SUM(CASE WHEN A.TAMANHO = 11 AND B.CONSUMO_QUANTIDADE_T11 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T11, MAX(B.CONSUMO_QUANTIDADE_T11) R11,
 SUM(CASE WHEN A.TAMANHO = 12 AND B.CONSUMO_QUANTIDADE_T12 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T12, MAX(B.CONSUMO_QUANTIDADE_T12) R12,
 SUM(CASE WHEN A.TAMANHO = 13 AND B.CONSUMO_QUANTIDADE_T13 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T13, MAX(B.CONSUMO_QUANTIDADE_T13) R13,
 SUM(CASE WHEN A.TAMANHO = 14 AND B.CONSUMO_QUANTIDADE_T14 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T14, MAX(B.CONSUMO_QUANTIDADE_T14) R14,
 SUM(CASE WHEN A.TAMANHO = 15 AND B.CONSUMO_QUANTIDADE_T15 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T15, MAX(B.CONSUMO_QUANTIDADE_T15) R15,
 SUM(CASE WHEN A.TAMANHO = 16 AND B.CONSUMO_QUANTIDADE_T16 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T16, MAX(B.CONSUMO_QUANTIDADE_T16) R16,
 SUM(CASE WHEN A.TAMANHO = 17 AND B.CONSUMO_QUANTIDADE_T17 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T17, MAX(B.CONSUMO_QUANTIDADE_T17) R17,
 SUM(CASE WHEN A.TAMANHO = 18 AND B.CONSUMO_QUANTIDADE_T18 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T18, MAX(B.CONSUMO_QUANTIDADE_T18) R18,
 SUM(CASE WHEN A.TAMANHO = 19 AND B.CONSUMO_QUANTIDADE_T19 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T19, MAX(B.CONSUMO_QUANTIDADE_T19) R19,
 SUM(CASE WHEN A.TAMANHO = 20 AND B.CONSUMO_QUANTIDADE_T20 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T20, MAX(B.CONSUMO_QUANTIDADE_T20) R20

FROM TBPEDIDO_ITEM_PROCESSADO A,
     TBMODELO_CONSUMO B,
     TBMODELO F

WHERE A.MODELO_CODIGO = B.MODELO_CODIGO
  AND A.MODELO_CODIGO = F.CODIGO
  AND A.REMESSA BETWEEN :REMESSA_1 AND :REMESSA_2

Group BY B.CONSUMO_PRODUTO_CODIGO, F.GRADE_CODIGO
Order By 3, 2

INTO
:produto_codigo,:grade_codigo,
:descricao, :UnidadeMedida_Sigla,:quantidade_Total,:R_Total,
:T01,:R01,:T02,:R02,:T03,:R03,:T04,:R04,:T05,:R05,:T06,:R06,:T07,:R07,:T08,:R08,
:T09,:R09,:T10,:R10,:T11,:R11,:T12,:R12,:T13,:R13,:T14,:R14,:T15,:R15,:T16,:R16,
:T17,:R17,:T18,:R18,:T19,:R19,:T20,:R20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_FICHA2_C (
    REMESSA_1 integer,
    REMESSA_2 integer)
returns (
    PRODUTO_CODIGO integer,
    GRADE_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    QUANTIDADE_TOTAL numeric(10,5),
    R_TOTAL numeric(10,5),
    T01 numeric(10,5),
    R01 numeric(10,5),
    T02 numeric(10,5),
    R02 numeric(10,5),
    T03 numeric(10,5),
    R03 numeric(10,5),
    T04 numeric(10,5),
    R04 numeric(10,5),
    T05 numeric(10,5),
    R05 numeric(10,5),
    T06 numeric(10,5),
    R06 numeric(10,5),
    T07 numeric(10,5),
    R07 numeric(10,5),
    T08 numeric(10,5),
    R08 numeric(10,5),
    T09 numeric(10,5),
    R09 numeric(10,5),
    T10 numeric(10,5),
    R10 numeric(10,5),
    T11 numeric(10,5),
    R11 numeric(10,5),
    T12 numeric(10,5),
    R12 numeric(10,5),
    T13 numeric(10,5),
    R13 numeric(10,5),
    T14 numeric(10,5),
    R14 numeric(10,5),
    T15 numeric(10,5),
    R15 numeric(10,5),
    T16 numeric(10,5),
    R16 numeric(10,5),
    T17 numeric(10,5),
    R17 numeric(10,5),
    T18 numeric(10,5),
    R18 numeric(10,5),
    T19 numeric(10,5),
    R19 numeric(10,5),
    T20 numeric(10,5),
    R20 numeric(10,5))
as
BEGIN
FOR  SELECT B.CONSUMO_PRODUTO_CODIGO,
 Max(F.Grade_Codigo),
 Max((SELECT D.DESCRICAO FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) DESCRICAO,
 Max((SELECT D.UNIDADEMEDIDA_SIGLA FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) UNIDADEMEDIDA_SIGLA,
 Sum(A.QUANTIDADE_PEDIDO) QUANTIDADE_TOTAL,
 MAX(B.CONSUMO_QUANTIDADE) R_TOTAL,
 SUM(CASE WHEN A.TAMANHO =  1 AND B.CONSUMO_QUANTIDADE_T01 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T01, MAX(B.CONSUMO_QUANTIDADE_T01) R01,
 SUM(CASE WHEN A.TAMANHO =  2 AND B.CONSUMO_QUANTIDADE_T02 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T02, MAX(B.CONSUMO_QUANTIDADE_T02) R02,
 SUM(CASE WHEN A.TAMANHO =  3 AND B.CONSUMO_QUANTIDADE_T03 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T03, MAX(B.CONSUMO_QUANTIDADE_T03) R03,
 SUM(CASE WHEN A.TAMANHO =  4 AND B.CONSUMO_QUANTIDADE_T04 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T04, MAX(B.CONSUMO_QUANTIDADE_T04) R04,
 SUM(CASE WHEN A.TAMANHO =  5 AND B.CONSUMO_QUANTIDADE_T05 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T05, MAX(B.CONSUMO_QUANTIDADE_T05) R05,
 SUM(CASE WHEN A.TAMANHO =  6 AND B.CONSUMO_QUANTIDADE_T06 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T06, MAX(B.CONSUMO_QUANTIDADE_T06) R06,
 SUM(CASE WHEN A.TAMANHO =  7 AND B.CONSUMO_QUANTIDADE_T07 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T07, MAX(B.CONSUMO_QUANTIDADE_T07) R07,
 SUM(CASE WHEN A.TAMANHO =  8 AND B.CONSUMO_QUANTIDADE_T08 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T08, MAX(B.CONSUMO_QUANTIDADE_T08) R08,
 SUM(CASE WHEN A.TAMANHO =  9 AND B.CONSUMO_QUANTIDADE_T09 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T09, MAX(B.CONSUMO_QUANTIDADE_T09) R09,
 SUM(CASE WHEN A.TAMANHO = 10 AND B.CONSUMO_QUANTIDADE_T10 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T10, MAX(B.CONSUMO_QUANTIDADE_T10) R10,
 SUM(CASE WHEN A.TAMANHO = 11 AND B.CONSUMO_QUANTIDADE_T11 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T11, MAX(B.CONSUMO_QUANTIDADE_T11) R11,
 SUM(CASE WHEN A.TAMANHO = 12 AND B.CONSUMO_QUANTIDADE_T12 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T12, MAX(B.CONSUMO_QUANTIDADE_T12) R12,
 SUM(CASE WHEN A.TAMANHO = 13 AND B.CONSUMO_QUANTIDADE_T13 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T13, MAX(B.CONSUMO_QUANTIDADE_T13) R13,
 SUM(CASE WHEN A.TAMANHO = 14 AND B.CONSUMO_QUANTIDADE_T14 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T14, MAX(B.CONSUMO_QUANTIDADE_T14) R14,
 SUM(CASE WHEN A.TAMANHO = 15 AND B.CONSUMO_QUANTIDADE_T15 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T15, MAX(B.CONSUMO_QUANTIDADE_T15) R15,
 SUM(CASE WHEN A.TAMANHO = 16 AND B.CONSUMO_QUANTIDADE_T16 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T16, MAX(B.CONSUMO_QUANTIDADE_T16) R16,
 SUM(CASE WHEN A.TAMANHO = 17 AND B.CONSUMO_QUANTIDADE_T17 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T17, MAX(B.CONSUMO_QUANTIDADE_T17) R17,
 SUM(CASE WHEN A.TAMANHO = 18 AND B.CONSUMO_QUANTIDADE_T18 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T18, MAX(B.CONSUMO_QUANTIDADE_T18) R18,
 SUM(CASE WHEN A.TAMANHO = 19 AND B.CONSUMO_QUANTIDADE_T19 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T19, MAX(B.CONSUMO_QUANTIDADE_T19) R19,
 SUM(CASE WHEN A.TAMANHO = 20 AND B.CONSUMO_QUANTIDADE_T20 > 0  THEN A.Quantidade_Pedido ELSE 0 END) T20, MAX(B.CONSUMO_QUANTIDADE_T20) R20

FROM TBPEDIDO_ITEM_PROCESSADO A,
     TBMODELO_CONSUMO B,
     TBMODELO F

WHERE A.MODELO_CODIGO = B.MODELO_CODIGO
  AND A.MODELO_CODIGO = F.CODIGO
  AND A.REMESSA BETWEEN :REMESSA_1 AND :REMESSA_2

Group BY B.CONSUMO_PRODUTO_CODIGO
Order By 3

INTO
:produto_codigo, :grade_codigo,
:descricao, :UnidadeMedida_Sigla,:quantidade_Total,:R_Total,
:T01,:R01,:T02,:R02,:T03,:R03,:T04,:R04,:T05,:R05,:T06,:R06,:T07,:R07,:T08,:R08,
:T09,:R09,:T10,:R10,:T11,:R11,:T12,:R12,:T13,:R13,:T14,:R14,:T15,:R15,:T16,:R16,
:T17,:R17,:T18,:R18,:T19,:R19,:T20,:R20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_FICHA2_PL_N (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    CONTROLE_1 integer)
returns (
    PRODUTO_CODIGO integer,
    GRADE_CODIGO integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    QUANTIDADE_TOTAL numeric(10,5),
    R_TOTAL numeric(10,5),
    T01 numeric(10,5),
    R01 numeric(10,5),
    T02 numeric(10,5),
    R02 numeric(10,5),
    T03 numeric(10,5),
    R03 numeric(10,5),
    T04 numeric(10,5),
    R04 numeric(10,5),
    T05 numeric(10,5),
    R05 numeric(10,5),
    T06 numeric(10,5),
    R06 numeric(10,5),
    T07 numeric(10,5),
    R07 numeric(10,5),
    T08 numeric(10,5),
    R08 numeric(10,5),
    T09 numeric(10,5),
    R09 numeric(10,5),
    T10 numeric(10,5),
    R10 numeric(10,5),
    T11 numeric(10,5),
    R11 numeric(10,5),
    T12 numeric(10,5),
    R12 numeric(10,5),
    T13 numeric(10,5),
    R13 numeric(10,5),
    T14 numeric(10,5),
    R14 numeric(10,5),
    T15 numeric(10,5),
    R15 numeric(10,5),
    T16 numeric(10,5),
    R16 numeric(10,5),
    T17 numeric(10,5),
    R17 numeric(10,5),
    T18 numeric(10,5),
    R18 numeric(10,5),
    T19 numeric(10,5),
    R19 numeric(10,5),
    T20 numeric(10,5),
    R20 numeric(10,5))
as
BEGIN
FOR  SELECT B.CONSUMO_PRODUTO_CODIGO PRODUTO_CODIGO, F.GRADE_CODIGO,
 Max((SELECT D.DESCRICAO FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) DESCRICAO,
 Max((SELECT D.UNIDADEMEDIDA_SIGLA FROM TBPRODUTO D WHERE B.CONSUMO_PRODUTO_CODIGO = D.CODIGO)) UNIDADEMEDIDA_SIGLA,
 Sum(E.QUANTIDADE_PEDIDO) QUANTIDADE_TOTAL,
 MAX(B.CONSUMO_QUANTIDADE) R_TOTAL,
 SUM(CASE WHEN A.TAMANHO =  1 AND B.CONSUMO_QUANTIDADE_T01 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T01, MAX(B.CONSUMO_QUANTIDADE_T01) R01,
 SUM(CASE WHEN A.TAMANHO =  2 AND B.CONSUMO_QUANTIDADE_T02 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T02, MAX(B.CONSUMO_QUANTIDADE_T02) R02,
 SUM(CASE WHEN A.TAMANHO =  3 AND B.CONSUMO_QUANTIDADE_T03 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T03, MAX(B.CONSUMO_QUANTIDADE_T03) R03,
 SUM(CASE WHEN A.TAMANHO =  4 AND B.CONSUMO_QUANTIDADE_T04 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T04, MAX(B.CONSUMO_QUANTIDADE_T04) R04,
 SUM(CASE WHEN A.TAMANHO =  5 AND B.CONSUMO_QUANTIDADE_T05 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T05, MAX(B.CONSUMO_QUANTIDADE_T05) R05,
 SUM(CASE WHEN A.TAMANHO =  6 AND B.CONSUMO_QUANTIDADE_T06 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T06, MAX(B.CONSUMO_QUANTIDADE_T06) R06,
 SUM(CASE WHEN A.TAMANHO =  7 AND B.CONSUMO_QUANTIDADE_T07 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T07, MAX(B.CONSUMO_QUANTIDADE_T07) R07,
 SUM(CASE WHEN A.TAMANHO =  8 AND B.CONSUMO_QUANTIDADE_T08 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T08, MAX(B.CONSUMO_QUANTIDADE_T08) R08,
 SUM(CASE WHEN A.TAMANHO =  9 AND B.CONSUMO_QUANTIDADE_T09 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T09, MAX(B.CONSUMO_QUANTIDADE_T09) R09,
 SUM(CASE WHEN A.TAMANHO = 10 AND B.CONSUMO_QUANTIDADE_T10 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T10, MAX(B.CONSUMO_QUANTIDADE_T10) R10,
 SUM(CASE WHEN A.TAMANHO = 11 AND B.CONSUMO_QUANTIDADE_T11 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T11, MAX(B.CONSUMO_QUANTIDADE_T11) R11,
 SUM(CASE WHEN A.TAMANHO = 12 AND B.CONSUMO_QUANTIDADE_T12 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T12, MAX(B.CONSUMO_QUANTIDADE_T12) R12,
 SUM(CASE WHEN A.TAMANHO = 13 AND B.CONSUMO_QUANTIDADE_T13 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T13, MAX(B.CONSUMO_QUANTIDADE_T13) R13,
 SUM(CASE WHEN A.TAMANHO = 14 AND B.CONSUMO_QUANTIDADE_T14 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T14, MAX(B.CONSUMO_QUANTIDADE_T14) R14,
 SUM(CASE WHEN A.TAMANHO = 15 AND B.CONSUMO_QUANTIDADE_T15 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T15, MAX(B.CONSUMO_QUANTIDADE_T15) R15,
 SUM(CASE WHEN A.TAMANHO = 16 AND B.CONSUMO_QUANTIDADE_T16 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T16, MAX(B.CONSUMO_QUANTIDADE_T16) R16,
 SUM(CASE WHEN A.TAMANHO = 17 AND B.CONSUMO_QUANTIDADE_T17 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T17, MAX(B.CONSUMO_QUANTIDADE_T17) R17,
 SUM(CASE WHEN A.TAMANHO = 18 AND B.CONSUMO_QUANTIDADE_T18 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T18, MAX(B.CONSUMO_QUANTIDADE_T18) R18,
 SUM(CASE WHEN A.TAMANHO = 19 AND B.CONSUMO_QUANTIDADE_T19 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T19, MAX(B.CONSUMO_QUANTIDADE_T19) R19,
 SUM(CASE WHEN A.TAMANHO = 20 AND B.CONSUMO_QUANTIDADE_T20 > 0  THEN E.QUANTIDADE_PEDIDO ELSE 0 END) T20, MAX(B.CONSUMO_QUANTIDADE_T20) R20

From TbRemessa_Item_Processado A, TbPedido_Item_Processado E,
     TBMODELO_CONSUMO B, TBMODELO F

Where (A.Remessa = E.Remessa and A.Controle = E.Remessa_Acumulado_Controle)
  AND  A.MODELO_CODIGO = B.MODELO_CODIGO
  AND  A.MODELO_CODIGO = F.CODIGO
  and  A.Estabelecimento_Codigo = :ESTABELECIMENTO_1
  and  A.Familia_Codigo         = :FAMILIA_1
  and (E.Situacao <= 2)
  AND A.programacao_controle  = :CONTROLE_1

Group BY B.CONSUMO_PRODUTO_CODIGO, F.GRADE_CODIGO
Order By 3, 2

INTO
:produto_codigo,:grade_codigo,
:descricao, :UnidadeMedida_Sigla,:quantidade_Total,:R_Total,
:T01,:R01,:T02,:R02,:T03,:R03,:T04,:R04,:T05,:R05,:T06,:R06,:T07,:R07,:T08,:R08,
:T09,:R09,:T10,:R10,:T11,:R11,:T12,:R12,:T13,:R13,:T14,:R14,:T15,:R15,:T16,:R16,
:T17,:R17,:T18,:R18,:T19,:R19,:T20,:R20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_NFE_PRODUTO (
    ESTABELECIMENTO_CODIGO_1 integer,
    EMPRESA_CODIGO_T integer,
    EMPRESA_CODIGO_1 integer,
    DATA_1 date,
    DATA_2 date,
    DATA_3 date,
    DATA_4 date,
    NOTAFISCAL_1 integer,
    NOTAFISCAL_2 integer,
    PRODUTO_1 integer,
    PRODUTO_2 integer,
    NATUREZA_1 integer,
    SITUACAO_1 integer,
    CFOP_CODIGO_T varchar(5),
    CFOP_CODIGO_1 varchar(5),
    CFOP_CODIGO_2 varchar(5),
    CFOP_CODIGO_3 varchar(5),
    CFOP_CODIGO_4 varchar(5),
    CFOP_CODIGO_5 varchar(5),
    CFOP_CODIGO_6 varchar(5),
    CFOP_CODIGO_7 varchar(5),
    CFOP_CODIGO_8 varchar(5),
    CFOP_CODIGO_9 varchar(5),
    CFOP_CODIGO_10 varchar(5),
    OPERACAO_CODIGO_T varchar(3),
    OPERACAO_CODIGO_1 varchar(3),
    OPERACAO_CODIGO_2 varchar(3),
    OPERACAO_CODIGO_3 varchar(3),
    OPERACAO_CODIGO_4 varchar(3),
    OPERACAO_CODIGO_5 varchar(3),
    OPERACAO_CODIGO_6 varchar(3),
    OPERACAO_CODIGO_7 varchar(3),
    OPERACAO_CODIGO_8 varchar(3),
    OPERACAO_CODIGO_9 varchar(3),
    OPERACAO_CODIGO_10 varchar(3),
    FAMILIA_CODIGO_T integer,
    FAMILIA_CODIGO_1 integer,
    FAMILIA_CODIGO_2 integer,
    FAMILIA_CODIGO_3 integer,
    FAMILIA_CODIGO_4 integer,
    FAMILIA_CODIGO_5 integer,
    FAMILIA_CODIGO_6 integer,
    FAMILIA_CODIGO_7 integer,
    FAMILIA_CODIGO_8 integer,
    FAMILIA_CODIGO_9 integer,
    FAMILIA_CODIGO_10 integer)
returns (
    PRODUTO_CODIGO integer,
    PRODUTO_DESCRICAO varchar(100),
    PRODUTO_UNIDADEMEDIDA varchar(10),
    FAMILIA_CODIGO integer,
    GRADE_CODIGO integer,
    QUANTIDADE numeric(10,5),
    VALOR_TOTAL numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5))
as
BEGIN
For Select Distinct(A.Produto_Codigo), A.Produto_Descricao,
B.UNIDADEMEDIDA_SIGLA, B.Familia_Codigo, B.Grade_Codigo,
Sum(A.Quantidade), Sum(A.valor_total),
Sum(A.T01), Sum(A.T02), Sum(A.T03), Sum(A.T04), Sum(A.T05),
Sum(A.T06), Sum(A.T07), Sum(A.T08), Sum(A.T09), Sum(A.T10),
Sum(A.T11), Sum(A.T12), Sum(A.T13), Sum(A.T14), Sum(A.T15),
Sum(A.T16), Sum(A.T17), Sum(A.T18), Sum(A.T19), Sum(A.T20)

From TbNfe_Item A
Inner Join TbProduto B On A.Produto_Codigo = B.Codigo
Inner Join TbNfE C     On A.nfe_controle   = C.Controle

Where  A.Estabelecimento_Codigo = :ESTABELECIMENTO_CODIGO_1

  and (A.Empresa_Codigo      > :EMPRESA_CODIGO_T or
       A.Empresa_Codigo      = :EMPRESA_CODIGO_1)

  and (C.Data_Emissao between :DATA_1 and :DATA_2)
  and (A.Data_Entrada between :DATA_3 and :DATA_4)

  and (A.Numero_NotaFiscal between :NOTAFISCAL_1 and :NOTAFISCAL_2)
  and (A.Produto_Codigo between :PRODUTO_1 and :PRODUTO_2)

  and (C.Natureza = :NATUREZA_1)
  and (C.Situacao = :SITUACAO_1)

  and (A.Cfop_Codigo <>:CFOP_CODIGO_T or
       A.Cfop_Codigo = :CFOP_CODIGO_1 or
       A.Cfop_Codigo = :CFOP_CODIGO_2 or
       A.Cfop_Codigo = :CFOP_CODIGO_3 or
       A.Cfop_Codigo = :CFOP_CODIGO_4 or
       A.Cfop_Codigo = :CFOP_CODIGO_5 or
       A.Cfop_Codigo = :CFOP_CODIGO_6 or
       A.Cfop_Codigo = :CFOP_CODIGO_7 or
       A.Cfop_Codigo = :CFOP_CODIGO_8 or
       A.Cfop_Codigo = :CFOP_CODIGO_9 or
       A.Cfop_Codigo = :CFOP_CODIGO_10)

  and (A.Operacao_Codigo <>:OPERACAO_CODIGO_T or
       A.Operacao_Codigo = :OPERACAO_CODIGO_1 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_2 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_3 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_4 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_5 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_6 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_7 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_8 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_9 or
       A.Operacao_Codigo = :OPERACAO_CODIGO_10)

  and (B.Familia_Codigo <>:FAMILIA_CODIGO_T or
       B.Familia_Codigo = :FAMILIA_CODIGO_1 or
       B.Familia_Codigo = :FAMILIA_CODIGO_2 or
       B.Familia_Codigo = :FAMILIA_CODIGO_3 or
       B.Familia_Codigo = :FAMILIA_CODIGO_4 or
       B.Familia_Codigo = :FAMILIA_CODIGO_5 or
       B.Familia_Codigo = :FAMILIA_CODIGO_6 or
       B.Familia_Codigo = :FAMILIA_CODIGO_7 or
       B.Familia_Codigo = :FAMILIA_CODIGO_8 or
       B.Familia_Codigo = :FAMILIA_CODIGO_9 or
       B.Familia_Codigo = :FAMILIA_CODIGO_10)

Group By A.Produto_Codigo, A.Produto_Descricao,
         B.UNIDADEMEDIDA_SIGLA, B.Familia_Codigo, B.Grade_Codigo
Order By A.Produto_Descricao

INTO
   :produto_codigo,
   :produto_descricao,
   :produto_unidademedida,
   :familia_codigo,
   :grade_codigo,
   :quantidade, :Valor_Total,
   :t01,:t02,:t03,:t04,:t05,:t06,:t07,:t08,:t09,:t10,
   :t11,:t12,:t13,:t14,:t15,:t16,:t17,:t18,:t19,:t20
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REL_NFS_ROMANEIO_ITEM (
    ESTABELECIMENTO_1 integer,
    CONTROLE_1 integer)
returns (
    SEQUENCIA integer,
    CONTROLE integer,
    NFS_CONTROLE integer,
    PRODUTO_CODIGO integer,
    PRODUTO_DESCRICAO varchar(100),
    PRODUTO_UNIDADEMEDIDA varchar(10),
    QUANTIDADE numeric(10,5),
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    CODIGO varchar(10))
as
BEGIN
FOR Select A.Sequencia, A.Controle, A.Nfs_Controle, A.PRODUTO_CODIGO,
       A.PRODUTO_DESCRICAO, A.PRODUTO_UNIDADEMEDIDA, A.QUANTIDADE,
       B.DESCRICAO, B.UNIDADEMEDIDA_SIGLA, B.CODIGO
From TbNfs_Item A
Left Join TbProduto_Edi B On A.Produto_Codigo = B.Produto_Codigo
                         and A.Empresa_Codigo = B.Empresa_Codigo
Where (A.Estabelecimento_Codigo  = :ESTABELECIMENTO_1)
  and (A.NFS_Controle            = :CONTROLE_1)
Order By A.Sequencia
Into
    :Sequencia,
    :Controle,
    :Nfs_Controle,
    :produto_codigo,
    :produto_descricao,
    :PRODUTO_UNIDADEMEDIDA,
    :QUANTIDADE,
    :DESCRICAO,
    :UNIDADEMEDIDA_SIGLA,
    :CODIGO
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REMESSA_PEDIDO_TALAO1 (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    REMESSA_1 integer,
    E smallint,
    D smallint)
returns (
    REMESSA integer,
    CONTROLE integer,
    MODELO_CODIGO integer,
    MODELO_ESPESSURA numeric(15,2),
    MODELO_DENSIDADE integer,
    MATRIZ_CODIGO integer,
    MATRIZ_DESCRICAO varchar(20),
    MATRIZ_LARGURA numeric(10,2),
    PRODUTO_CODIGO integer,
    TAMANHO integer,
    QUANTIDADE numeric(10,2),
    TOLERANCIA numeric(10,2),
    CHAPAS numeric(10,2),
    PLACAS numeric(10,2),
    SOBRAS numeric(10,2),
    PLACAS_ smallint,
    SOBRAS_ smallint,
    CONSUMO_MEDIO numeric(10,2),
    OBSERVACAO varchar(200),
    SITUACAO integer,
    DESCRICAO varchar(100),
    GRADE_CODIGO integer,
    UNIDADEMEDIDA_SIGLA varchar(10),
    COR_CODIGO integer,
    PERCENTUAL_TALAO numeric(15,2),
    CLASSE varchar(1),
    PROGRAMACAO_BOCA integer,
    PROGRAMACAO_ESTEIRA integer,
    PROGRAMACAO_SEQUENCIA integer,
    ESTEIRA_DESCRICAO varchar(20),
    HORA_PRODUCAO timestamp,
    HORA_LIBERACAO timestamp,
    LIB char(1),
    COMPOSICAO varchar(20))
as
BEGIN
FOR Select A.REMESSA,A.CONTROLE,A.MODELO_CODIGO,
/* (Select F.ESPESSURA From TbModelo F Where A.MODELO_CODIGO = F.Codigo),*/

     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END))*1000 ESPESSURA,

     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)) DENSIDADE,

    A.MATRIZ_CODIGO,
    (Select First 1 G.DESCRICAO From TbMATRIZ G Where A.MATRIZ_CODIGO = G.Codigo),
    (Select First 1 H.LARGURA   From TbMATRIZ H Where A.MATRIZ_CODIGO = H.Codigo),
    A.PRODUTO_CODIGO,A.TAMANHO,A.QUANTIDADE, A.Tolerancia,

    A.CHAPAS,A.PLACAS,A.SOBRAS,A.PLACAS_,A.SOBRAS_,

    A.CONSUMO_MEDIO,A.OBSERVACAO,A.SITUACAO,
    (Select First 1 B.DESCRICAO From TbProduto B Where A.PRODUTO_CODIGO = B.Codigo),
    (Select First 1 C.GRADE_CODIGO From TbProduto C Where A.PRODUTO_CODIGO = C.Codigo),
    (Select First 1 D.UNIDADEMEDIDA_SIGLA From TbProduto D Where A.PRODUTO_CODIGO = D.Codigo),
    (Select First 1 E.COR_CODIGO From TbProduto E Where A.PRODUTO_CODIGO = E.Codigo),
    (Select First 1 Coalesce(G.Percentual_Talao,0) From TbProduto E, TbCor G Where A.PRODUTO_CODIGO = E.Codigo and E.Cor_Codigo = G.Codigo),
    (Select First 1 Coalesce(G.Classe,'0') From TbProduto E, TbCor G Where A.PRODUTO_CODIGO = E.Codigo and E.Cor_Codigo = G.Codigo),
     A.Programacao_Boca, A.Programacao_Esteira, A.Programacao_Sequencia,
    (Select First 1 E.Descricao From TbEsteira E Where A.Programacao_Esteira = E.Codigo),
     A.HORA_PRODUCAO, A.HORA_LIBERACAO, Coalesce(A.lib,'0'),
    (Select First 1 F.Composicao From TbProduto_Ficha F Where A.PRODUTO_CODIGO = F.PRODUTO_CODIGO) 

From TbRemessa_Item_Processado A
WHERE A.REMESSA > 0
  and A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
  and A.FAMILIA_CODIGO = :FAMILIA_1
  and A.REMESSA = :REMESSA_1

Order By A.CONTROLE

INTO
    :REMESSA        ,
    :CONTROLE       ,
    :MODELO_CODIGO  ,
    :MODELO_ESPESSURA,
    :modelo_densidade,
    :MATRIZ_CODIGO  ,
    :MATRIZ_DESCRICAO,
    :MATRIZ_LARGURA ,
    :PRODUTO_CODIGO ,
    :TAMANHO        ,
    :QUANTIDADE     ,
    :TOLERANCIA     ,
    :CHAPAS         ,
    :PLACAS         ,
    :SOBRAS         ,
    :PLACAS_        ,
    :SOBRAS_        ,
    :CONSUMO_MEDIO  ,
    :OBSERVACAO     ,
    :SITUACAO       ,
    :DESCRICAO      ,
    :GRADE_CODIGO   ,
    :UNIDADEMEDIDA_SIGLA ,
    :COR_CODIGO,
    :Percentual_Talao,
    :Classe,
    :Programacao_Boca,
    :Programacao_Esteira,
    :Programacao_Sequencia,
    :Esteira_Descricao,
    :HORA_PRODUCAO,
    :HORA_LIBERACAO,
    :Lib,
    :Composicao
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REMESSA_PEDIDO_TALAO2 (
    ESTABELECIMENTO_1 integer,
    FAMILIA_1 integer,
    REMESSA_1 integer,
    E smallint,
    D smallint)
returns (
    REMESSA integer,
    CONTROLE integer,
    MODELO_CODIGO integer,
    MODELO_ESPESSURA numeric(15,2),
    MODELO_DENSIDADE integer,
    MATRIZ_CODIGO integer,
    MATRIZ_DESCRICAO varchar(20),
    MATRIZ_LARGURA numeric(10,2),
    PRODUTO_CODIGO integer,
    TAMANHO integer,
    QUANTIDADE numeric(10,2),
    TOLERANCIA numeric(10,2),
    CHAPAS numeric(10,2),
    PLACAS numeric(10,2),
    SOBRAS numeric(10,2),
    PLACAS_ smallint,
    SOBRAS_ smallint,
    CONSUMO_MEDIO numeric(10,2),
    OBSERVACAO varchar(200),
    SITUACAO integer,
    DESCRICAO varchar(100),
    GRADE_CODIGO integer,
    UNIDADEMEDIDA_SIGLA varchar(10),
    COR_CODIGO integer,
    PERCENTUAL_TALAO numeric(15,2),
    CLASSE varchar(1),
    PROGRAMACAO_BOCA integer,
    PROGRAMACAO_ESTEIRA integer,
    PROGRAMACAO_SEQUENCIA integer,
    ESTEIRA_DESCRICAO varchar(20),
    HORA_PRODUCAO timestamp,
    HORA_LIBERACAO timestamp,
    LIB char(1),
    COMPOSICAO varchar(20))
as
BEGIN
FOR Select A.REMESSA,A.CONTROLE,A.MODELO_CODIGO,
     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :E)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END))*1000 ESPESSURA,

     ((CASE WHEN A.TAMANHO =  1  THEN
     (Select First 1 F.T01 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  2  THEN
     (Select First 1 F.T02 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  3  THEN
     (Select First 1 F.T03 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  4  THEN
     (Select First 1 F.T04 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  5  THEN
     (Select First 1 F.T05 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  6  THEN
     (Select First 1 F.T06 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  7  THEN
     (Select First 1 F.T07 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  8  THEN
     (Select First 1 F.T08 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  9  THEN
     (Select First 1 F.T09 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  10 THEN
     (Select First 1 F.T10 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  11 THEN
     (Select First 1 F.T11 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  12 THEN
     (Select First 1 F.T12 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  13 THEN
     (Select First 1 F.T13 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  14 THEN
     (Select First 1 F.T14 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  15 THEN
     (Select First 1 F.T15 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  16 THEN
     (Select First 1 F.T16 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  17 THEN
     (Select First 1 F.T17 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  18 THEN
     (Select First 1 F.T18 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  19 THEN
     (Select First 1 F.T19 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (CASE WHEN A.TAMANHO =  20 THEN
     (Select First 1 F.T20 From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D) ELSE
     (Select First 1 F.Quantidade From TbModelo_Ficha_Tecnica F
      Where A.MODELO_CODIGO = F.Modelo_Codigo and F.Tipo_Codigo = :D)
      END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)END)) DENSIDADE,

    A.MATRIZ_CODIGO,
    (Select First 1 G.DESCRICAO From TbMATRIZ G Where A.MATRIZ_CODIGO = G.Codigo),
    (Select First 1 H.LARGURA   From TbMATRIZ H Where A.MATRIZ_CODIGO = H.Codigo),
    A.PRODUTO_CODIGO,A.TAMANHO,A.QUANTIDADE, A.Tolerancia,

    A.CHAPAS,A.PLACAS,A.SOBRAS,A.PLACAS_,A.SOBRAS_,

    A.CONSUMO_MEDIO,A.OBSERVACAO,A.SITUACAO,
    P.Descricao,
    P.Grade_Codigo,
    P.UNIDADEMEDIDA_SIGLA,
    P.Cor_Codigo,
    (Select First 1 Coalesce(G.Percentual_Talao,0) From TbCor G Where P.Cor_Codigo = G.Codigo),
    (Select First 1 Coalesce(G.Classe,'0') From TbCor G Where P.Cor_Codigo = G.Codigo),
     A.Programacao_Boca, A.Programacao_Esteira, A.Programacao_Sequencia,
    (Select First 1 E.Descricao From TbEsteira E Where A.Programacao_Esteira = E.Codigo),
     A.HORA_PRODUCAO, A.HORA_LIBERACAO, Coalesce(A.lib, '0'),
    (Select First 1 F.Composicao From TbProduto_Ficha F Where A.PRODUTO_CODIGO = F.PRODUTO_CODIGO) 

From TbRemessa_Item_Processado A, TbProduto P
WHERE A.PRODUTO_CODIGO = P.Codigo
  and A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_1
  and A.FAMILIA_CODIGO = :FAMILIA_1
  and A.REMESSA = :REMESSA_1

Order By 5, 4, (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo), A.Controle

INTO
    :REMESSA        ,
    :CONTROLE       ,
    :MODELO_CODIGO  ,
    :MODELO_ESPESSURA,
    :modelo_densidade,
    :MATRIZ_CODIGO  ,
    :MATRIZ_DESCRICAO,
    :MATRIZ_LARGURA ,
    :PRODUTO_CODIGO ,
    :TAMANHO        ,
    :QUANTIDADE     ,
    :TOLERANCIA     ,
    :CHAPAS         ,
    :PLACAS         ,
    :SOBRAS         ,
    :PLACAS_        ,
    :SOBRAS_        ,
    :CONSUMO_MEDIO  ,
    :OBSERVACAO     ,
    :SITUACAO       ,
    :DESCRICAO      ,
    :GRADE_CODIGO   ,
    :UNIDADEMEDIDA_SIGLA ,
    :COR_CODIGO,
    :Percentual_Talao,
    :Classe,
    :Programacao_Boca,
    :Programacao_Esteira,
    :Programacao_Sequencia,
    :Esteira_Descricao,
    :HORA_PRODUCAO,
    :HORA_LIBERACAO,
    :Lib,
    :Composicao
DO SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_STATUS_PECA2 (
    ITIPO varchar(10),
    IPECA_ID integer)
returns (
    TIPO varchar(10),
    ID integer,
    PECA varchar(12),
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    QUANTIDADE_SALDO numeric(18,5),
    UNIDADEMEDIDA_SIGLA varchar(10),
    LOCALIZACAO_ID integer,
    REMESSA varchar(10),
    TALAO_ID varchar(10),
    TAMANHO integer,
    ESTABELECIMENTO_ID integer)
as
begin

    IF(ITIPO = 'P')THEN
    BEGIN

        FOR
            select first 1
                'P' as TIPO,
                r.id,
                'P'||lpad(r.id,11,'0') as PECA,
                r.produto_id as produto_cod,
                p.descricao as produto_desc,
                r.saldo as QUANTIDADE,
                p.UNIDADEMEDIDA_SIGLA,
                r.localizacao_entrada,
                '' as remessa,
                '' as talao,
                r.tamanho,
                r.estabelecimento_id
            from tbrevisao r, tbproduto p
            WHERE r.produto_id = p.codigo
            AND r.id = :IPECA_ID
        INTO
            TIPO,
            ID,
            PECA,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            QUANTIDADE_SALDO,
            UNIDADEMEDIDA_SIGLA,
            LOCALIZACAO_ID,
            REMESSA,
            TALAO_ID,
            TAMANHO,
            ESTABELECIMENTO_ID
        DO BEGIN
          suspend;
        END
                        
    END ELSE
    BEGIN
        IF(ITIPO = 'RD')THEN
        BEGIN

          FOR
             select first 1
                'RD' as TIPO,
                d.id,
                'RD'||lpad(d.id,10,'0') as PECA,
                d.produto_id,
                p.descricao as produto_descricao,
                d.quantidade_saldo,
                p.UNIDADEMEDIDA_SIGLA,
                d.localizacao_id as localizacao_id,
                v.remessa,
                fn_lpad(d.remessa_talao_id,3,'0') as talao_id,
                d.tamanho,
                v.estabelecimento_id
            from vwremessa_talao_detalhe d,
                vwremessa_talao t,
                vwremessa v,
                tbproduto p
            
            where p.codigo = d.produto_id
            and v.remessa_id = d.remessa_id
            and t.remessa_id = d.remessa_id
            and t.remessa_talao_id = d.remessa_talao_id
            AND D.ID = :IPECA_ID

          INTO
            TIPO,
            ID,
            PECA,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            QUANTIDADE_SALDO,
            UNIDADEMEDIDA_SIGLA,
            LOCALIZACAO_ID,
            REMESSA,
            TALAO_ID,
            TAMANHO,
            ESTABELECIMENTO_ID
          DO BEGIN
            suspend;
          END

       END ELSE
       BEGIN
            exception "..." 'Tipo invalido, Permitidos: "P" - Revisão, "RD" - Talões.';
       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(10);
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_ALTERNATIVO 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_ALTERNATIVO 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 SPUI_PRODUTO_EDI (
    EMPRESA_CODIGO integer,
    PRODUTO_CODIGO integer,
    CODIGO varchar(20),
    CODIGO_XML varchar(100),
    CODIGO_VSK varchar(20),
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    CUSTO_UNITARIO numeric(15,4),
    COR_DESCRICAO varchar(20),
    ALTERANFE char(1),
    PRIORIDADE integer,
    MULTIPLO integer,
    OBSERVACAO varchar(100) = null)
returns (
    ID integer)
as
BEGIN

    UPDATE OR INSERT INTO TBPRODUTO_EDI (EMPRESA_CODIGO, PRODUTO_CODIGO, CODIGO, CODIGO_XML, DESCRICAO,
            UNIDADEMEDIDA_SIGLA, ALTERANFE, CUSTO_UNITARIO, CODIGO_VSK, COR_DESCRICAO,
            PRIORIDADE, MULTIPLO, OBSERVACAO)
    VALUES (:EMPRESA_CODIGO, :PRODUTO_CODIGO, :CODIGO, :CODIGO_XML, :DESCRICAO, :UNIDADEMEDIDA_SIGLA, :ALTERANFE,
    :CUSTO_UNITARIO, :CODIGO_VSK, :COR_DESCRICAO, :PRIORIDADE, :MULTIPLO, :OBSERVACAO)
    MATCHING (PRODUTO_CODIGO, EMPRESA_CODIGO)
    RETURNING ID INTO :ID;

  SUSPEND;

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(10),
    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_SIGLA, 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_SIGLA, 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 procedure SPU_PRODUTO_EDI (
    PRODUTO integer,
    EMPRESA integer,
    DESCRICAO varchar(100),
    UNIDADEMEDIDA_SIGLA varchar(10),
    CODIGO varchar(20),
    CODIGO_VSK varchar(20),
    ALTERANFE char(1),
    T01 varchar(20),
    T02 varchar(20),
    T03 varchar(20),
    T04 varchar(20),
    T05 varchar(20),
    T06 varchar(20),
    T07 varchar(20),
    T08 varchar(20),
    T09 varchar(20),
    T10 varchar(20),
    T11 varchar(20),
    T12 varchar(20),
    T13 varchar(20),
    T14 varchar(20),
    T15 varchar(20),
    T16 varchar(20),
    T17 varchar(20),
    T18 varchar(20),
    T19 varchar(20),
    T20 varchar(20),
    CUSTO_UNITARIO numeric(15,4))
as
BEGIN

    UPDATE or Insert INTO TBPRODUTO_EDI (
    PRODUTO_CODIGO,EMPRESA_CODIGO,DESCRICAO,UNIDADEMEDIDA_SIGLA,CODIGO,CODIGO_VSK,
    T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
    T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,ALTERANFE,CUSTO_UNITARIO)
    VALUES (:PRODUTO,:EMPRESA,:DESCRICAO,:UNIDADEMEDIDA_SIGLA,:CODIGO,:CODIGO_VSK,
    :T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
    :T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:T20,:ALTERANFE,:CUSTO_UNITARIO)
    MATCHING (PRODUTO_CODIGO,EMPRESA_CODIGO);

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(10);
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_SIGLA,''))>0,M.UNIDADEMEDIDA_SIGLA,F.UNIDADEMEDIDA_SIGLA),
       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_SIGLA,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 ttbdefeito_trans_item_b0iu_01 for tbdefeito_transacao_item
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

       if (NEW.QUANTIDADE > 10000) then
           BEGIN
             Exception "..." 'QUANTIDADE INVALIDA: '||NEW.QUANTIDADE||
             ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           END

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR,
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Id and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE REGISTRAR DEFEITOS DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
--        if (:FAM_USUARIO = 0) then
--            BEGIN
--                Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR DEFEITOS DA FAMÍLIA DESTE PRODUTO: '||
--                :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
--                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
--            END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          NEW.USUARIO_ID = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_trans_item_b0iu_01 for tbestoque_transacao_item
active before insert position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(200);
DECLARE VARIABLE FRAC  CHAR(1);
DECLARE VARIABLE PROD_STATUS CHAR(1);
DECLARE VARIABLE FAMILIA_ID  INTEGER;
DECLARE VARIABLE FAM_USUARIO INTEGER;
DECLARE VARIABLE FAM_OPERACAO VARCHAR(200);
DECLARE VARIABLE Loc VARCHAR(600);
declare variable Operacao_id INTEGER;
declare variable GRADE_ID INTEGER;
declare variable CCUSTO varchar(10);
BEGIN

   if (NEW.QUANTIDADE < 0 or
       NEW.T01 < 0 or NEW.T02 < 0 or NEW.T03 < 0 or NEW.T04 < 0 or NEW.T05 < 0 or
       NEW.T06 < 0 or NEW.T07 < 0 or NEW.T08 < 0 or NEW.T09 < 0 or NEW.T10 < 0 or
       NEW.T11 < 0 or NEW.T12 < 0 or NEW.T13 < 0 or NEW.T14 < 0 or NEW.T15 < 0 or
       NEW.T16 < 0 or NEW.T17 < 0 or NEW.T18 < 0 or NEW.T19 < 0 or NEW.T20 < 0) then
       BEGIN
          Exception "..." 'QUANTIDADE NAO PODE SER NEGATIVO: '||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END

   if (New.Tipo <> 'B') then --Beneficiamento
       Begin
       OPERACAO_ID = Coalesce((Select First 1 O.ID From TbOperacao O
                            Where O.Codigo = New.Operacao_Codigo
                              and O.Tipo   = New.Tipo
                              and O.NotaFiscal = IIF(new.nfe_item_controle>0 or New.Nfs_item_controle > 0,'1','0')),0);
       End else
       Begin
       OPERACAO_ID = Coalesce((Select First 1 O.ID From TbOperacao O
                            Where O.Codigo = New.Operacao_Codigo
                              and O.NotaFiscal = IIF(new.nfe_item_controle>0 or New.Nfs_item_controle > 0,'1','0')),0);
       End

   if (:OPERACAO_ID = 0) then
       BEGIN
          Exception "..." 'OPERACAO INVALIDA OU NAO CADASTRADA: '||coalesce(New.Operacao_Codigo,'')||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);
   USUARIO_NOME = current_user;

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUARIO INATIVO OU NAO CADASTRADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);
        if (New.Nfs_Item_Controle > 0 or New.Nfe_Item_Controle > 0) then
            Begin
            Fam_Operacao = '';
            End else
            Begin
            Fam_Operacao = Coalesce((Select First 1 O.Familias From TbOperacao O Where O.Codigo = New.Operacao_Codigo),'');
            End

        For
        Select First 1
        U.SIGLA,
        P.DESCRICAO,
        U.PODE_FRACIONAR,
        P.FAMILIA_CODIGO,
        Coalesce((Select First 1 F.Familia_Id From Tbusuario_Familia F Where F.Familia_Id = P.Familia_Codigo and F.Usuario_Id = :USUARIO_ID),0),
        Coalesce((Select First 1 C.Valor_Ext From TbControle_Usuario C Where C.Usuario_Id = :USUARIO_ID and C.Id = 127),''),
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Codigo),0),-1),
        P.STATUS,
        P.GRADE_CODIGO,
        Coalesce((Select First 1 L.CCusto From TbLocalizacao L Where L.Codigo = New.Localizacao_Codigo),'')
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :FAMILIA_ID, :FAM_USUARIO, :Loc, :ESTABELECIMENTO, :PROD_STATUS, :GRADE_ID, :CCUSTO
        Do
        Begin
          if (:PROD_STATUS <> '1') then
              BEGIN
                Exception "..." 'TRANSACAO DE ESTOQUE NAO PERMITIDA PARA PRODUTO INATIVO, PRODUTO:'||coalesce(New.Produto_Codigo,0)||'  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

           if (:GRADE_ID > 0) Then
               begin
               if (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 <= 0) then
                   BEGIN
                   Exception "..." 'PRODUTO COM GRADE, EXIGE QUANTIDADE EM ALGUM TAMANHO! PROD.'||NEW.PRODUTO_CODIGO||' QUANT.'||NEW.QUANTIDADE||' OPER.'||NEW.OPERACAO_CODIGO||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   END
               End else
           if (:GRADE_ID = 0) Then
               begin
               if (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 > 0) then
                   BEGIN
                   Exception "..." 'PRODUTO SEM GRADE, NAO HA NECESSIDADE DE QUANTIDADE POR TAMANHO! '||
                   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   END
               End

          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Codigo),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (Position(lPad(New.Localizacao_Codigo,2,'0'),:LOC) = 0) Then
              BEGIN
                Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE COM A LOCALIZACAO INFORMADA: '||New.Localizacao_Codigo||'-'||
                Coalesce((Select First 1 L.Descricao From TbLocalizacao L Where L.Codigo = New.Localizacao_Codigo),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_USUARIO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DA FAMILIA DESTE PRODUTO: '||
                  :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_OPERACAO <> '' and Position(lPad(:FAMILIA_ID,4,'0'),:FAM_OPERACAO) = 0) then
              BEGIN
                  Exception "..." 'OPERACAO NAO PODE SER USADA COM A FAMILIA DE PRODUTOS INFORMADA.'||
                  'OPERACAO: '||NEW.OPERACAO_CODIGO||'- FAMILIA: '||:FAMILIA_ID||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

          if ((COALESCE(NEW.CENTRO_DE_CUSTO, '') = '') AND (COALESCE(:CCUSTO, '') <> '')) then
              BEGIN
              NEW.CENTRO_DE_CUSTO = :CCUSTO;
              END

          NEW.USUARIO_CODIGO = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttboc_item_b0iu_01 for tboc_item
active before insert or update position 0
AS
DECLARE VARIABLE UM VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;


BEGIN


For
    Select First 1
        coalesce(U.SIGLA,'') as SIGLA,
        P.DESCRICAO,
        U.PODE_FRACIONAR,
        P.LOCALIZACAO_CODIGO,
        (SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
    From TbProduto P
    left join TbUnidadeMedida U on P.Unidademedida_Sigla = U.Sigla
    Where P.Codigo = New.Produto_Codigo
    Into
        :UM,
        :DESCR,
        :FRAC,
        :LOC1,
        :LOC2
Do
Begin

  if(UM = '')then
  begin
     exception "..." 'Unidades de medida do produto nao foi encontrada. Produto:' || New.Produto_Codigo;
  end

  if (New.Controle > 0) then
      Begin
      /* Trigger text */

      if ((NEW.VALOR * NEW.QUANTIDADE) + NEW.ACRESCIMO - NEW.DESCONTO < 0) THEN
          Exception "..." 'VALOR TOTAL DO ITEM INVALIDO, NAO PODE SER NEGATIVO! '||
          NEW.PRODUTO_CODIGO||'-'||:DESCR||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';


      if (:FRAC = 'N') then
          BEGIN
          if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
              Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
              NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
              ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          END
    
       if (Coalesce(New.Localizacao_Codigo,0) = 0) then
           Begin
           if (:Loc1 > 0) then
               Begin
               New.Localizacao_Codigo = :Loc1;
               End else
           if (:Loc2 > 0) then
               Begin
               New.Localizacao_Codigo = :Loc2;
               End else
               Begin
               Exception "..." 'LOCALIZACAO PADRAO DE ESTOQUE DO PRODUTO NAO LOCALIZADA '||
               NEW.PRODUTO_CODIGO||'-'||:DESCR||
               ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
               End
           End


    if (Inserting) then
        Begin
            UPDATE OR INSERT INTO TbOc_Item_Saldo (
            Oc,Oc_Item_Controle,Quantidade,        
            T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
            T11,T12,T13,T14,T15,T16,T17,T18,T19,T20)
            VALUES (NEW.OC,NEW.CONTROLE,NEW.QUANTIDADE,
            NEW.T01,NEW.T02,NEW.T03,NEW.T04,NEW.T05,NEW.T06,NEW.T07,NEW.T08,NEW.T09,NEW.T10,
            NEW.T11,NEW.T12,NEW.T13,NEW.T14,NEW.T15,NEW.T16,NEW.T17,NEW.T18,NEW.T19,NEW.T20)
            MATCHING (Oc,Oc_Item_Controle);
        End

    if (Updating) then
        Begin
        --EXCEPTION "..."NEW.QUANTIDADE||' - '||OLD.QUANTIDADE;   6 -> 3

        if (NEW.QUANTIDADE <> OLD.QUANTIDADE or
            NEW.T01 <> OLD.T01 or NEW.T02 <> OLD.T02 or
            NEW.T03 <> OLD.T03 or NEW.T04 <> OLD.T04 or
            NEW.T05 <> OLD.T05 or NEW.T06 <> OLD.T06 or
            NEW.T07 <> OLD.T07 or NEW.T08 <> OLD.T08 or
            NEW.T09 <> OLD.T09 or NEW.T10 <> OLD.T10 or
            NEW.T11 <> OLD.T11 or NEW.T12 <> OLD.T12 or
            NEW.T13 <> OLD.T13 or NEW.T14 <> OLD.T14 or
            NEW.T15 <> OLD.T15 or NEW.T16 <> OLD.T16 or
            NEW.T17 <> OLD.T17 or NEW.T18 <> OLD.T18 or
            NEW.T19 <> OLD.T19 or NEW.T20 <> OLD.T20) then
            Begin
                --UPDATE OR INSERT INTO TbOc_Item_Saldo T (
                --Oc,Oc_Item_Controle,Quantidade,
                --T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
                --T11,T12,T13,T14,T15,T16,T17,T18,T19,T20)
                --VALUES (NEW.OC,NEW.CONTROLE, NEW.QUANTIDADE ,
                --NEW.T01,NEW.T02,NEW.T03,NEW.T04,NEW.T05,NEW.T06,NEW.T07,NEW.T08,NEW.T09,NEW.T10,
                --NEW.T11,NEW.T12,NEW.T13,NEW.T14,NEW.T15,NEW.T16,NEW.T17,NEW.T18,NEW.T19,NEW.T20)
                --MATCHING (Oc,Oc_Item_Controle);
                UPDATE TBOC_ITEM_SALDO T
                SET OC = NEW.OC,
                    QUANTIDADE  =  T.QUANTIDADE - (OLD.QUANTIDADE - NEW.QUANTIDADE),
                    T01         =  T.T01 - (OLD.T01 - NEW.T01),
                    T02         =  T.T02 - (OLD.T02 - NEW.T02),
                    T03         =  T.T03 - (OLD.T03 - NEW.T03),
                    T04         =  T.T04 - (OLD.T04 - NEW.T04),
                    T05         =  T.T05 - (OLD.T05 - NEW.T05),
                    T06         =  T.T06 - (OLD.T06 - NEW.T06),
                    T07         =  T.T07 - (OLD.T07 - NEW.T07),
                    T08         =  T.T08 - (OLD.T08 - NEW.T08),
                    T09         =  T.T09 - (OLD.T09 - NEW.T09),
                    T10         =  T.T10 - (OLD.T10 - NEW.T10),
                    T11         =  T.T11 - (OLD.T11 - NEW.T11),
                    T12         =  T.T12 - (OLD.T12 - NEW.T12),
                    T13         =  T.T13 - (OLD.T13 - NEW.T13),
                    T14         =  T.T14 - (OLD.T14 - NEW.T14),
                    T15         =  T.T15 - (OLD.T15 - NEW.T15),
                    T16         =  T.T16 - (OLD.T16 - NEW.T16),
                    T17         =  T.T17 - (OLD.T17 - NEW.T17),
                    T18         =  T.T18 - (OLD.T18 - NEW.T18),
                    T19         =  T.T19 - (OLD.T19 - NEW.T19),
                    T20         =  T.T20 - (OLD.T20 - NEW.T20)
                WHERE (OC_ITEM_CONTROLE = NEW.CONTROLE);

            End
        End

    End

End

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b0i_00 for tbpedido_item
active before insert position 0
AS
DECLARE VARIABLE UM VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;
BEGIN
For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.LOCALIZACAO_CODIGO,
(SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
From TbProduto P, TbUnidadeMedida U
Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
Into :UM, :DESCR, :FRAC, :LOC1, :LOC2
Do
Begin

  if (:FRAC = 'N') then
      BEGIN
      if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
          Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
          NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      END

   if (Coalesce(New.Localizacao_ID,0) = 0) then
       Begin
       if (:Loc1 > 0) then
           Begin
           New.Localizacao_ID = :Loc1;
           End else
       if (:Loc2 > 0) then
           Begin
           New.Localizacao_ID = :Loc2;
           End else
           Begin
           Exception "..." 'LOCALIZAÇÃO PADRÃO DE ESTOQUE DO PRODUTO NÃO LOCALIZADA '||
           NEW.PRODUTO_CODIGO||'-'||:DESCR||
           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End
End

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b0u_00 for tbpedido_item
active before update position 0
AS
DECLARE VARIABLE UM VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;
BEGIN

  if (New.Quantidade <> Old.Quantidade or
      New.Produto_Codigo <> Old.Produto_Codigo) Then
      Begin

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.LOCALIZACAO_CODIGO,
        (SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :LOC1, :LOC2
        Do
        Begin
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (Coalesce(New.Localizacao_ID,0) = 0) then
              Begin
               if (:Loc1 > 0) then
                   Begin
                   New.Localizacao_ID = :Loc1;
                   End else
               if (:Loc2 > 0) then
                   Begin
                   New.Localizacao_ID = :Loc2;
                   End else
                   Begin
                   Exception "..." 'LOCALIZAÇÃO PADRÃO DE ESTOQUE DO PRODUTO NÃO LOCALIZADA '||
                   NEW.PRODUTO_CODIGO||'-'||:DESCR||
                   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   End
              End
        End
      End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_parada_b2i for tbregistro_parada
active before insert position 2
AS
declare variable vEMAIL VarChar(500);
declare variable vCORPO_EMAIL BLOB SUB_TYPE 0 SEGMENT SIZE 80;
declare variable VJUSTIFICATIVA VarChar(200);
declare variable vOPERADOR_NOME VarChar(20);
declare variable VTEMPOORIGINAL Integer;

declare variable LINHA_ID INTEGER;
declare variable LINHA_DESCRICAO VARCHAR(50);
declare variable MODELO_ID INTEGER;                                                
declare variable MODELO_DESCRICAO VARCHAR(50);
declare variable COR_ID INTEGER;
declare variable COR_DESCRICAO VARCHAR(20);
declare variable TAMANHO INTEGER;
declare variable TAM_DESCRICAO VARCHAR(10);
declare variable FERRAMENTA_ID INTEGER;
declare variable FERRAMENTA_DESCRICAO VARCHAR(100);
declare variable GP_ID INTEGER;
declare variable GP_DESCRICAO VARCHAR(20);
declare variable UP_ID INTEGER;
declare variable UP_DESCRICAO VARCHAR(20);
declare variable ESTACAO INTEGER;
declare variable ESTACAO_DESCRICAO VARCHAR(20);
declare variable REMESSA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO INTEGER;
declare variable QUANTIDADE NUMERIC(18,4);
declare variable UM VARCHAR(10);

BEGIN

  if (New.Status > 0 and New.tabela = 'INEFICIENCIA') then -- ID da Justificativa
      Begin

      For
      Select P.Linha_Codigo Linha_Id,
            (Select First 1 L.Descricao From TbModelo_Linha L Where L.Codigo = P.Linha_Codigo) Linha_Descricao,
             P.Modelo_Codigo Modelo_Id,
            (Select First 1 M.Descricao From TbModelo M Where M.Codigo = P.Modelo_Codigo) Modelo_Descricao,
             P.Cor_Codigo Cor_ID,
            (Select First 1 C.Descricao From TbCor C Where C.Codigo = P.Cor_Codigo) Cor_Descricao,
             PR.Tamanho,
            (Select First 1 Tam_Descricao From SP_TAMANHO_GRADE (P.Grade_Codigo,PR.Tamanho)) Tam_Descricao,
             PR.Ferramenta_ID,
            (Select First 1 F.Serie||'-'||F.Descricao From TbFerramentaria F Where F.ID = PR.Ferramenta_ID) Ferramenta_Descricao,
             PR.GP_Id,
            (Select First 1 G.Descricao From TBGP G Where G.ID = PR.Gp_ID) GP_Descricao,
             PR.UP_Id,
            (Select First 1 U.Descricao From TbUP U Where U.ID = PR.UP_ID) UP_Descricao,
             PR.Estacao,
            (Select First 1 S.Descricao From TbSub_UP S Where S.Up_ID = PR.Up_ID and S.ID = PR.Estacao) Estacao_Descricao,
             PR.Remessa_ID,
             PR.Tabela_ID Talao_ID,
            (Select First 1 R.Controle From TbRemessa_Item_Processado R Where R.Id = PR.Tabela_ID) Talao,
             PR.Quantidade, P.UNIDADEMEDIDA_SIGLA UM
        From TbProgramacao PR, TbProduto P
       Where PR.Produto_ID = P.Codigo
         and PR.ID = :NEW.Tabela_ID
        Into :LINHA_ID,:LINHA_DESCRICAO,:MODELO_ID,:MODELO_DESCRICAO,:COR_ID,
             :COR_DESCRICAO,:TAMANHO,:TAM_DESCRICAO,:FERRAMENTA_ID,
             :FERRAMENTA_DESCRICAO,:GP_ID,:GP_DESCRICAO,:UP_ID,:UP_DESCRICAO,
             :ESTACAO,:ESTACAO_DESCRICAO,:REMESSA_ID,:TALAO_ID,:TALAO,:QUANTIDADE,:UM

          Do Begin

             vEMAIL         = Coalesce((Select First 1 CC.VALOR_EXT from TbControle_N CC Where CC.ID = 239),'');
             vOPERADOR_NOME = Coalesce((Select First 1 O.Nome From TbOperador O Where O.Codigo = New.Operador_ID),'');
             VJUSTIFICATIVA = Coalesce((Select First 1 J.Descricao From TbJustificativa J Where J.ID = New.Status),'');
             VTEMPOORIGINAL = COALESCE((Select First 1 MF.TM from tbup_fluxo pf, TBMODELO_FLUXO_PRODUCAO mf
                                         where mf.fluxo_id  = pf.fluxo_id and pf.up_id = :UP_ID
                                           and mf.modelo_id = :MODELO_ID and mf.cor_id = :COR_ID
                                           and mf.tamanho   = :TAMANHO),0);

             if (vEMAIL <> '') then
                 Begin
                 vCORPO_EMAIL = ' LINHA: '||:LINHA_ID||' - '||:LINHA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' MODELO: '||:MODELO_ID||' - '||:MODELO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' COR: '||:COR_ID||' - '||:COR_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' TAMANHO: '||:TAM_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' FERRAMENTA: '||:FERRAMENTA_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' GP/UP/ESTACAO: '||:GP_DESCRICAO||'/'||:UP_DESCRICAO||'/'||:ESTACAO_DESCRICAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' REMESSA/TALAO: '||:REMESSA_ID||' - '||:TALAO||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' QUANTIDADE: '||Trunc(:QUANTIDADE)||' '||:UM||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' OPERADOR: '||NEW.OPERADOR_ID||' - '||vOPERADOR_NOME||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' DATA/HORA REGISTRO: '||FORMATDATETIME(Current_TimeStamp)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' TEMPO MAQUINA ATUAL: '||Trunc(:VTEMPOORIGINAL)||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ' JUSTIFICATIVA: '||:vJustificativa||': '||NEW.OBSERVACAO
                                --||ASCII_CHAR(13)||ASCII_CHAR(10)||'<br>'||
                                ;

                 Insert Into tbemail (email, usuario_id, assunto, corpo, status, datahora)
                 Values (:vEmail, 0, 'GC - REGISTRO DE JUSTIFICATIVA: '||:vJustificativa, :vCORPO_EMAIL, 0, Current_TimeStamp);
                 End
    
             End
      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(10);
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_ALTERNATIVO 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_SIGLA 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 ttbrequisicao_b0iu_01 for tbrequisicao
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
DECLARE VARIABLE FAMILIA_ID  INTEGER;
DECLARE VARIABLE FAM_USUARIO INTEGER;
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.FAMILIA_CODIGO,
        Coalesce((Select First 1 F.Familia_Id From TbUsuario_Familia F Where F.Familia_Id = P.Familia_Codigo and F.Usuario_Id = :USUARIO_ID),0),
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.PRODUTO_ID and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :FAMILIA_ID, :FAM_USUARIO, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR REQUISIÇÕES PARA O ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_USUARIO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR REQUISIÇÕES PARA A FAMÍLIA DESTE PRODUTO: '||
                  :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
        --  NEW.USUARIO_ID = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_b0iu_01 for tbsobra
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(10);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR,
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Id and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR SOBRAS DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
        End
     End
END
^

SET TERM ; ^

/****************************************************************************/
/****************************************************************************/
/**** UNIDADEMEDIDA_ALTERNATIVO *********************************************/

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(10);
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_ALTERNATIVO is not null and f.UNIDADEMEDIDA_ALTERNATIVO <> '' 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_ALTERNATIVO 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_ALTERNATIVO 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(10);
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_ALTERNATIVO is not null and f.UNIDADEMEDIDA_ALTERNATIVO <> '' 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_ALTERNATIVO 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_ALTERNATIVO 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(10);
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_ALTERNATIVO 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_ALTERNATIVO 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(10);
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_ALTERNATIVO 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_ALTERNATIVO 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
