CREATE OR ALTER procedure spc_corte_etiqueta (
    remessa_id integer,
    remessa_talao_id integer)
returns (
    etiq blob sub_type 1 segment size 80 character set win1252)
as
declare variable id integer;
declare variable remessa integer;
declare variable remessa_data date;
declare variable remessa_requisicao char(4);
declare variable remessa_tipo char(4);
declare variable controle integer;
declare variable modelo_codigo integer;
declare variable modelo_densidade integer;
declare variable modelo_espessura numeric(18,2);
declare variable matriz_codigo integer;
declare variable matriz_descricao varchar(80);
declare variable matriz_largura numeric(18,5);
declare variable produto_codigo integer;
declare variable produto_descricao varchar(400);
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_sobra numeric(18,4);
declare variable tolerancia numeric(18,4);
declare variable chapas numeric(18,5);
declare variable placas numeric(18,5);
declare variable sobras numeric(18,5);
declare variable placas_ smallint;
declare variable sobras_ smallint;
declare variable lib char(4);
declare variable consumo_medio numeric(18,5);
declare variable placa_altura numeric(18,5);
declare variable placa_comprimento numeric(18,5);
declare variable placa_sobra numeric(18,5);
declare variable placa numeric(18,5);
declare variable observacao varchar(800);
declare variable situacao integer;
declare variable descricao varchar(400);
declare variable grade_codigo integer;
declare variable cor_codigo integer;
declare variable classe varchar(20);
declare variable programacao_boca integer;
declare variable programacao_esteira integer;
declare variable tamanho_grade varchar(40);
declare variable programacao_sequencia integer;
declare variable esteira_descricao varchar(80);
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable turno char(4);
declare variable cor_descricao varchar(80);
declare variable seq varchar(40);
declare variable perfil char(10);
declare variable perc_sobra numeric(18,1);
declare variable flag char(4);
declare variable aproveitamento numeric(18,4);
declare variable mediapar numeric(18,4);
declare variable talao_origem blob sub_type 1 segment size 100;
declare variable largura_t numeric(15,5);
declare variable comprimento_t numeric(15,5);
declare variable placa_t numeric(15,5);
declare variable sobra_t numeric(15,5);
declare variable up_destino varchar(255);
declare variable cliente varchar(255);
declare variable localizacao varchar(255);
declare variable talao_vinculo_controle varchar(50);
begin

SELECT FIRST 1
    ID,
    REMESSA,
    REMESSA_DATA,
    REMESSA_REQUISICAO,
    REMESSA_TIPO,
    CONTROLE,
    MODELO_CODIGO,
    MODELO_DENSIDADE,
    MODELO_ESPESSURA,
    MATRIZ_CODIGO,
    MATRIZ_DESCRICAO,
    MATRIZ_LARGURA,
    PRODUTO_CODIGO,
    PRODUTO_DESCRICAO,
    TAMANHO,
    QUANTIDADE,
    QUANTIDADE_SOBRA,
    TOLERANCIA,
    CHAPAS,
    PLACAS,
    SOBRAS,
    PLACAS_,
    SOBRAS_,
    LIB,
    CONSUMO_MEDIO,
    PLACA_ALTURA,
    PLACA_COMPRIMENTO,
    PLACA_SOBRA,
    PLACA,
    OBSERVACAO,
    SITUACAO,
    DESCRICAO,
    GRADE_CODIGO,
    COR_CODIGO,
    CLASSE,
    PROGRAMACAO_BOCA,
    PROGRAMACAO_ESTEIRA,
    TAMANHO_GRADE,
    PROGRAMACAO_SEQUENCIA,
    ESTEIRA_DESCRICAO,
    HORA_PRODUCAO,
    HORA_LIBERACAO,
    TURNO,
    COR_DESCRICAO,
    SEQ,
    PERFIL,
    PERC_SOBRA,
    FLAG,
    APROVEITAMENTO,
    MEDIAPAR,
    CLIENTE,
    LOCALIZACAO,
    TALAO_VINCULO_CONTROLE
FROM
    (SELECT
        X.ID,
        X.REMESSA,
        X.REMESSA_DATA,
        X.REMESSA_REQUISICAO,
        X.REMESSA_TIPO,
        X.CONTROLE,
        X.MODELO_CODIGO,

        CAST(SUBSTRING(X.DENS_ESPESS FROM 1 FOR 5) AS INTEGER)  MODELO_DENSIDADE,

        CAST(SUBSTRING(X.DENS_ESPESS FROM 6 FOR 5) AS NUMERIC(15,2))  MODELO_ESPESSURA,
        
        X.MATRIZ_CODIGO,
        X.MATRIZ_DESCRICAO,
        X.MATRIZ_LARGURA,
        X.PRODUTO_CODIGO,
        X.PRODUTO_DESCRICAO,
        X.TAMANHO,
        X.QUANTIDADE,
        X.QUANTIDADE_SOBRA,
        X.TOLERANCIA,
        X.CHAPAS,
        X.PLACAS,
        X.SOBRAS,
        X.PLACAS_,
        X.SOBRAS_,
        X.LIB,
        X.CONSUMO_MEDIO,
        X.OBSERVACAO,
        X.SITUACAO,
        X.DESCRICAO,
        X.GRADE_CODIGO,
        X.COR_CODIGO,
        X.CLASSE,
        X.PROGRAMACAO_BOCA,
        X.PROGRAMACAO_ESTEIRA,
        X.TAMANHO_GRADE,
        X.PROGRAMACAO_SEQUENCIA,
        X.ESTEIRA_DESCRICAO,
        X.HORA_PRODUCAO,
        X.HORA_LIBERACAO,
        X.TURNO,
        (SELECT FIRST 1 DESCRICAO FROM TBCOR WHERE CODIGO = X.COR_CODIGO) COR_DESCRICAO,
        X.SEQ,
        X.PERFIL,
        X.PERC_SOBRA,
        '0' FLAG,
        X.APROVEITAMENTO,

        (SELECT FIRST 1 LARGURA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_ALTURA,
        (SELECT FIRST 1 COMPRIMENTO
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_COMPRIMENTO,  
        (SELECT FIRST 1 SOBRA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA_SOBRA,    
        (SELECT FIRST 1 PLACA
          FROM SPC_REMESSA_CONSUMO_MATRIZ(X.MATRIZ_CODIGO,X.GRADE_CODIGO,X.TAMANHO)) PLACA,

        CAST(IIF(X.CONSUMO_MEDIO>0,(X.QUANTIDADE-X.QUANTIDADE_SOBRA)/X.CONSUMO_MEDIO,0) AS NUMERIC(15,4)) MEDIAPAR,
        CLIENTE,
        LOCALIZACAO,
        TALAO_VINCULO_CONTROLE
    FROM
       (SELECT
            A.ID,
            A.REMESSA,
            R.DATA REMESSA_DATA,
            R.REQUISICAO REMESSA_REQUISICAO,
            R.TIPO REMESSA_TIPO,
            A.CONTROLE,
            A.MODELO_CODIGO,
            P.GRADE_CODIGO,
            A.MATRIZ_CODIGO,
            A.PRODUTO_CODIGO,
            P.DESCRICAO PRODUTO_DESCRICAO,
            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.COR_CODIGO,
            A.PROGRAMACAO_BOCA,
            A.PROGRAMACAO_ESTEIRA,
            A.PROGRAMACAO_SEQUENCIA,
            A.HORA_PRODUCAO,
            A.HORA_LIBERACAO,
            A.TURNO,
            A.SEQ,
                         
            COALESCE(A.LIB,'0') LIB,

            COALESCE((SELECT SUM(S.QUANTIDADE) FROM TBREQUISICAO_SOBRA S
                       WHERE S.REMESSA = A.REMESSA AND S.TALAO = A.CONTROLE
                         AND S.REQUISICAO_ID = 0),0.0000) QUANTIDADE_SOBRA,

           (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (P.GRADE_CODIGO,A.TAMANHO)) TAMANHO_GRADE,

            IIF(A.ESPESSURA > 0 AND A.DENSIDADE > 0, LPAD(A.DENSIDADE,5,'0')||LPAD(A.ESPESSURA,5,'0'),
            IIF(M.ESPESSURA > 0 AND M.DENSIDADE > 0, LPAD(M.DENSIDADE,5,'0')||LPAD(M.ESPESSURA,5,'0'),
            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 = A.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'),'0000000000'))) DENS_ESPESS,
        
            (SELECT FIRST 1 E.DESCRICAO FROM TBESTEIRA E WHERE A.PROGRAMACAO_ESTEIRA = E.CODIGO) ESTEIRA_DESCRICAO,

            (SELECT FIRST 1 G.DESCRICAO FROM TBMATRIZ G WHERE A.MATRIZ_CODIGO = G.CODIGO) MATRIZ_DESCRICAO,

            (SELECT FIRST 1 H.LARGURA   FROM TBMATRIZ H WHERE A.MATRIZ_CODIGO = H.CODIGO) MATRIZ_LARGURA,

            (SELECT FIRST 1 COALESCE(CLASSE||'.'||LPAD(SUBCLASSE,3,'0'),'0.000') FROM TBCOR WHERE P.COR_CODIGO = CODIGO) CLASSE,

            (SELECT FIRST 1 COALESCE(PERFIL,'') FROM TBCOR WHERE P.COR_CODIGO = CODIGO) PERFIL, A.PERC_SOBRA, A.APROVEITAMENTO,

            COALESCE((SELECT
                X.TABELA_ID ||' - '||
               (SELECT FIRST 1 (SELECT FIRST 1 LEFT(E.RAZAOSOCIAL,20) FROM TBEMPRESA E WHERE E.CODIGO = P.CLIENTE_CODIGO)
                  FROM TBPEDIDO P
                 WHERE P.PEDIDO = X.TABELA_ID) CLIENTE
            FROM (
                SELECT FIRST 1 B.TABELA_ID
                FROM TBPEDIDO_ITEM_PROCESSADO A, TBREMESSA_ITEM_ALOCACAO B
                WHERE A.REMESSA = C.REMESSA_ID
                  AND A.REMESSA_ACUMULADO_CONTROLE = C.REMESSA_TALAO_ID
                  AND A.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_ID
                  AND A.REMESSA = B.REMESSA
                  AND A.CONTROLE = B.TALAO
                  AND TIPO = 'P'
                  AND B.STATUS = 1) X
            ),'PRONTA ENTREGA')CLIENTE,
            COALESCE((SELECT FIRST 1 LPAD(L.CODIGO,3,0)||' - '||L.DESCRICAO AS LOCALIZACAO FROM TBLOCALIZACAO L WHERE L.CODIGO = A.LOCALIZACAO_ID),'') AS LOCALIZACAO,
            COALESCE((SELECT FIRST 1 ' T.' ||FN_LPAD(T1.REMESSA_TALAO_ID,4,0) || ' '
               FROM VWREMESSA_TALAO T1
              WHERE T1.ID = A.TALAO_VINCULO),'') TALAO_VINCULO_CONTROLE
    
        
        FROM
            TBPRODUTO P,
            TBMODELO M,
            TBREMESSA R,
            TBREMESSA_ITEM_PROCESSADO A
            left join VWREMESSA_CONSUMO C on A.REMESSA = C.REMESSA_ID and a.CONTROLE = C.REMESSA_TALAO_ID
        WHERE          
            A.PRODUTO_CODIGO = P.CODIGO
        AND A.MODELO_CODIGO  = M.CODIGO
        AND A.REMESSA        = R.NUMERO
        AND A.REMESSA        = :REMESSA_ID
        AND A.CONTROLE       = :REMESSA_TALAO_ID
        ORDER BY A.CONTROLE
        ) X
    ) Y
    ORDER BY MODELO_DENSIDADE DESC, MODELO_ESPESSURA DESC, CLASSE DESC, COR_DESCRICAO, PLACA_ALTURA, PLACA_COMPRIMENTO, ESTEIRA_DESCRICAO DESC, PRODUTO_DESCRICAO DESC
INTO
    ID,
    REMESSA,
    REMESSA_DATA,
    REMESSA_REQUISICAO,
    REMESSA_TIPO,
    CONTROLE,
    MODELO_CODIGO,
    MODELO_DENSIDADE,
    MODELO_ESPESSURA,
    MATRIZ_CODIGO,
    MATRIZ_DESCRICAO,
    MATRIZ_LARGURA,
    PRODUTO_CODIGO,
    PRODUTO_DESCRICAO,
    TAMANHO,
    QUANTIDADE,
    QUANTIDADE_SOBRA,
    TOLERANCIA,
    CHAPAS,
    PLACAS,
    SOBRAS,
    PLACAS_,
    SOBRAS_,
    LIB,
    CONSUMO_MEDIO,
    PLACA_ALTURA,
    PLACA_COMPRIMENTO,
    PLACA_SOBRA,
    PLACA,
    OBSERVACAO,
    SITUACAO,
    DESCRICAO,
    GRADE_CODIGO,
    COR_CODIGO,
    CLASSE,
    PROGRAMACAO_BOCA,
    PROGRAMACAO_ESTEIRA,
    TAMANHO_GRADE,
    PROGRAMACAO_SEQUENCIA,
    ESTEIRA_DESCRICAO,
    HORA_PRODUCAO,
    HORA_LIBERACAO,
    TURNO,
    COR_DESCRICAO,
    SEQ,
    PERFIL,
    PERC_SOBRA,
    FLAG,
    APROVEITAMENTO,
    MEDIAPAR,
    CLIENTE,
    LOCALIZACAO,
    TALAO_VINCULO_CONTROLE;


    ETIQ = '';
    IF ( ID > 0) THEN
    BEGIN
    
        ETIQ = COALESCE((
        SELECT FIRST 1 E.SCRIPT
          FROM TBETIQUETAS E
         WHERE E.ID = 136),'');
        
        SELECT FIRST 1
               FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_ORIGEM,
               FN_DESCRICAO('TBUP',T2.UP_ID)UP_DESCRICAO
          FROM VWREMESSA_CONSUMO C,
               TBREMESSA_CONSUMO_VINCULO V,
               VWREMESSA_TALAO T2
         WHERE C.REMESSA_ID        = :REMESSA
           AND C.REMESSA_TALAO_ID  = :CONTROLE
           AND V.CONSUMO_ID        = C.ID
           AND T2.REMESSA_ID       = V.REMESSA_ID
           AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
          INTO TALAO_ORIGEM,
               UP_DESTINO;

        TALAO_ORIGEM = COALESCE(TALAO_ORIGEM,'');
        UP_DESTINO   = COALESCE(UP_DESTINO,'');




        ETIQ = REPLACE(ETIQ,':)'                   ,'#2');
        ETIQ = REPLACE(ETIQ,'#MTZ#'                ,MATRIZ_DESCRICAO);
        ETIQ = REPLACE(ETIQ,'#CONSUMO#'            ,FN_FORMAT_NUMBER(CONSUMO_MEDIO,2)||' MTS '||FN_FORMAT_NUMBER(MEDIAPAR,2)||' PRS/MT');
        ETIQ = REPLACE(ETIQ,'#ESPESSURA#'          ,FN_FORMAT_NUMBER(MODELO_ESPESSURA,2));
        ETIQ = REPLACE(ETIQ,'#DENSIDADE#'          ,FN_LPAD(MODELO_DENSIDADE,2,0));
        ETIQ = REPLACE(ETIQ,'#CODIGOLIBERACAO1#'   ,FN_LPAD(REMESSA,6,0)||FN_LPAD(CONTROLE,4,0)||'03');
        ETIQ = REPLACE(ETIQ,'#CODIGOLIBERACAO2#'   ,FN_LPAD(REMESSA,6,0)||FN_LPAD(CONTROLE,4,0)||'04');
        ETIQ = REPLACE(ETIQ,'#NUMERO_TALAO#'       ,FN_LPAD(CONTROLE,3,0));
        ETIQ = REPLACE(ETIQ,'#TAMANHO#'            ,TAMANHO_GRADE);
        ETIQ = REPLACE(ETIQ,'#DATA_HORA_IMPRESSAO#',FN_DATE('NOW','DT HRS'));
        ETIQ = REPLACE(ETIQ,'#QUANTIDADELIBERACAO#',FN_FORMAT_NUMBER(QUANTIDADE-QUANTIDADE_SOBRA));
        ETIQ = REPLACE(ETIQ,'#QUANTIDADE_SOBRA#'   ,FN_FORMAT_NUMBER(QUANTIDADE_SOBRA));
        ETIQ = REPLACE(ETIQ,'#FABRICA#'            ,ESTEIRA_DESCRICAO);
        ETIQ = REPLACE(ETIQ,'#DATA#'               ,FN_DATE(REMESSA_DATA,'DT'));
        ETIQ = REPLACE(ETIQ,'#CHAPAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(CHAPAS),2,0));
        ETIQ = REPLACE(ETIQ,'#PLACAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(PLACAS),2,0));
        ETIQ = REPLACE(ETIQ,'#SOBRAS#'             ,FN_LPAD(FN_FORMAT_NUMBER(SOBRAS),2,0));
        ETIQ = REPLACE(ETIQ,'#SUB_PLACAS#'         ,FN_LPAD(FN_FORMAT_NUMBER(PLACAS_),2,0));
        ETIQ = REPLACE(ETIQ,'#SUB_SOBRAS#'         ,FN_LPAD(FN_FORMAT_NUMBER(SOBRAS_),2,0));
        ETIQ = REPLACE(ETIQ,'#REMESSA#'            ,FN_LPAD(REMESSA,5,0));
        ETIQ = REPLACE(ETIQ,'#TURNO#'              ,TURNO);
        ETIQ = REPLACE(ETIQ,'#OB#'                 ,'');
        ETIQ = REPLACE(ETIQ,'#SUBUP#'              ,FN_LPAD(PROGRAMACAO_BOCA,2,0));
        ETIQ = REPLACE(ETIQ,'#CLASSE#'             ,'('||FN_FORMAT_NUMBER(CLASSE)||')');
        ETIQ = REPLACE(ETIQ,'#PRODUTO_ID#'         ,FN_LPAD(PRODUTO_CODIGO,5,0));
        ETIQ = REPLACE(ETIQ,'#PRODUTO#'            ,FN_REMOVE_ACENTOS(PRODUTO_DESCRICAO));
        ETIQ = REPLACE(ETIQ,'#PRODUTO2#'           ,TRIM(REPLACE(PRODUTO_DESCRICAO,'BOJO','')));
        ETIQ = REPLACE(ETIQ,'#COMPOSICAO#'         ,'');
        ETIQ = REPLACE(ETIQ,'#VIP#'                ,IIF(REMESSA_TIPO = '2','VIP',''));
        ETIQ = REPLACE(ETIQ,'#CLIENTE#'            ,CLIENTE );
        ETIQ = REPLACE(ETIQ,'#APROVEITAMENTO#'     ,IIF(APROVEITAMENTO > 0,'+'||FN_FORMAT_NUMBER(APROVEITAMENTO),''));
        ETIQ = REPLACE(ETIQ,'#TALAO_ORIGEM#'       ,TALAO_ORIGEM);
        ETIQ = REPLACE(ETIQ,'#UP_DESTINO#'         ,UP_DESTINO);
    
        IF ( MATRIZ_CODIGO > 0 ) THEN
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TAMANHOPLACAS#',FN_FORMAT_NUMBER(PLACA_ALTURA,2)||' X '|| FN_FORMAT_NUMBER(PLACA_COMPRIMENTO,2));
            
            IF (PLACA_SOBRA > 0) THEN
            BEGIN
                ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#',FN_FORMAT_NUMBER(PLACA_ALTURA,2)||' X '|| FN_FORMAT_NUMBER(MATRIZ_LARGURA - (PLACA * PLACA_COMPRIMENTO),2));
            END
            ELSE
            BEGIN
                ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#','');
            END
        END
        ELSE
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TAMANHOPLACAS#','');
            ETIQ = REPLACE(ETIQ,'#TAMANHOSOBRAS#','');
        END
    
                                            
        ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#',TALAO_VINCULO_CONTROLE);
--        IF (SUBSTRING(SEQ FROM 1 FOR 3) = 'ULT') THEN
--        BEGIN
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL1#','');
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#',SEQ);
--        END ELSE
--        BEGIN
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL1#',SEQ);
--            ETIQ = REPLACE(ETIQ,'#SEQUENCIAL2#','');
--        END
    
        IF ((PERC_SOBRA > 0) AND (REMESSA_REQUISICAO = '0')) THEN --SOBRAS
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TIPO#','R');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#',FN_FORMAT_NUMBER(PERC_SOBRA,1)||'%');
        END
        ELSE
        IF ((CONTROLE > 9000) AND (REMESSA_REQUISICAO = '1')) THEN --REQUISIÇÃO
        BEGIN
            ETIQ = REPLACE(ETIQ,'#TIPO#','R');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#',' REQ ');
        END
        ELSE
        BEGIN                                         --NORMAL
            ETIQ = REPLACE(ETIQ,'#TIPO#','N');
            ETIQ = REPLACE(ETIQ,'#COMENTARIO#','');
        END
    END

    SUSPEND;

end;



CREATE OR ALTER procedure spc_minutos_disponiveis (
    familia_id integer,
    gp_id varchar(10),
    perfil_up varchar(10),
    mes integer,
    ano integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
begin

  data_inicio = Cast('01.'||mes||'.'||ano as Date);
  data_fim = Cast(FN_END_OF_MONTH(Data_Inicio) as Date);


for
Select
    ESTACOES,
    DIAS,
    MINUTOS,
    MINUTOS_DIA,
    MINUTOS_NOITE,
    MINUTOS_DIA * DIAS TOTAL_MINUTOS_DIA,
    MINUTOS_NOITE * DIAS TOTAL_MINUTOS_NOITE
From (
Select COUNT(ESTACAO_ID) ESTACOES, TRUNC(AVG(DIAS)) DIAS, SUM(MINUTOS) MINUTOS,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'528') as Integer) From TbControle_N N Where Id = 108) Minutos_Dia,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'486') as Integer) From TbControle_N N Where Id = 109) Minutos_Noite
From (
Select GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID, Count(DATA) Dias, Sum(MINUTOS) MINUTOS
From (
Select Distinct C.GP_ID, E.Descricao Gp_Descricao, C.Up_Id, U.Descricao Up_Descricao, U.Perfil, C.Estacao_Id, CE.Data, CE.Minutos
  From TBCALENDARIO_ESTACAO C, TbSetor U, TbEsteira E, TbCalendario_Esteira CE
 Where C.DATA Between :data_inicio and :data_fim
   and C.Up_Id = U.Codigo
   and E.Codigo = C.Gp_Id
   and CE.Esteira_id = C.GP_ID
   and C.Data = CE.Data
   and CE.Minutos > 0
   and E.Familia_Codigo = :Familia_Id
   and C.Gp_Id like Replace(:Gp_Id,'*','%')
   and U.Perfil like Replace(:Perfil_Up,'*','%') 
) Group By GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID
)
)
  into
    :ESTACOES,
    :DIAS,
    :MINUTOS,
    :MINUTOS_DIA,
    :MINUTOS_NOITE,
    :TOTAL_MINUTOS_DIA,
    :TOTAL_MINUTOS_NOITE

  do
  begin
  post_event 'Connection attempt by blocked user.';
    suspend;
  end
end;



CREATE OR ALTER procedure spc_minutos_disponiveis2 (
    familia_id integer,
    gp_id varchar(10),
    perfil_up varchar(10),
    mes1 integer,
    ano1 integer,
    mes2 integer,
    ano2 integer)
returns (
    estacoes integer,
    dias integer,
    minutos integer,
    minutos_dia integer,
    minutos_noite integer,
    total_minutos_dia integer,
    total_minutos_noite integer)
as
declare variable data_inicio date;
declare variable data_fim date;
declare variable data_inicio2 date;
begin

  data_inicio = Cast('01.'||mes1||'.'||ano1 as Date);

  data_inicio2 = Cast('01.'||mes2||'.'||ano2 as Date);
  data_fim = Cast(FN_END_OF_MONTH(data_inicio2) as Date);


for
Select
    ESTACOES,
    DIAS,
    MINUTOS,
    MINUTOS_DIA,
    MINUTOS_NOITE,
    MINUTOS_DIA * DIAS TOTAL_MINUTOS_DIA,
    MINUTOS_NOITE * DIAS TOTAL_MINUTOS_NOITE
From (
Select COUNT(ESTACAO_ID) ESTACOES, TRUNC(AVG(DIAS)) DIAS, SUM(MINUTOS) MINUTOS,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'528') as Integer) From TbControle_N N Where Id = 108) Minutos_Dia,
(Select First 1 Cast(Coalesce(N.Valor_Ext,'486') as Integer) From TbControle_N N Where Id = 109) Minutos_Noite
From (
Select GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID, Count(DATA) Dias, Sum(MINUTOS) MINUTOS
From (
Select Distinct C.GP_ID, E.Descricao Gp_Descricao, C.Up_Id, U.Descricao Up_Descricao, U.Perfil, C.Estacao_Id, CE.Data, CE.Minutos
  From TBCALENDARIO_ESTACAO C, TbSetor U, TbEsteira E, TbCalendario_Esteira CE
 Where C.DATA Between :data_inicio and :data_fim
   and C.Up_Id = U.Codigo
   and E.Codigo = C.Gp_Id
   and CE.Esteira_id = C.GP_ID
   and C.Data = CE.Data
   and CE.Minutos > 0
   and E.Familia_Codigo = :Familia_Id
   and C.Gp_Id like Replace(:Gp_Id,'*','%')
   and U.Perfil like Replace(:Perfil_Up,'*','%') 
) Group By GP_ID, GP_DESCRICAO, UP_ID, UP_DESCRICAO, ESTACAO_ID
)
)
  into
    :ESTACOES,
    :DIAS,
    :MINUTOS,
    :MINUTOS_DIA,
    :MINUTOS_NOITE,
    :TOTAL_MINUTOS_DIA,
    :TOTAL_MINUTOS_NOITE

  do
  begin
  post_event 'Connection attempt by blocked user.';
    suspend;
  end
end;



CREATE OR ALTER procedure spc_producao_conformacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(500),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    perdas_perc numeric(15,2),
    eficiencia numeric(15,2),
    setup_previsto numeric(15,2),
    setup_realizado numeric(15,2),
    cor_efic integer,
    justificativa varchar(1000),
    programacao_id integer,
    requisicao_id integer,
    gp_id integer,
    gp_descricao varchar(500),
    up_id integer,
    up_descricao varchar(500),
    estacao integer,
    estacao_descricao varchar(500),
    remessa integer,
    remessa_id integer,
    remessa_data date,
    remessa_talao_id integer,
    talao_id integer,
    produto_id integer,
    produto_descricao varchar(500),
    modelo_id integer,
    modelo_descricao varchar(500),
    cor_id integer,
    cor_descricao varchar(500),
    tamanho integer,
    tamanho_descricao varchar(500),
    quantidade numeric(15,2),
    um varchar(500),
    ferramenta_id integer,
    ferramenta_descicao varchar(500),
    datahora_realizado_inicio varchar(20),
    datahora_realizado_fim varchar(20),
    tempo_previsto numeric(15,2),
    tempo_realizado numeric(15,2),
    tempo_previsto_operacional numeric(15,2),
    tempo_previsto_ferramenta numeric(15,2),
    tempo_previsto_aquecimento numeric(15,2),
    tempo_previsto_aprovacao numeric(15,2),
    tempo_realizado_operacional numeric(15,2),
    tempo_realizado_ferramenta numeric(15,2),
    tempo_realizado_aquecimento numeric(15,2),
    tempo_realizado_aprovacao numeric(15,2),
    perfil_sku varchar(10),
    tempo_parado numeric(15,2),
    perdas numeric(15,2),
    perfil_sku_descricao varchar(500),
    perdas_perc1 numeric(15,2),
    eficiencia_minima numeric(15,2),
    eficiencia_a numeric(15,2),
    eficiencia_b numeric(15,2),
    perdas_a numeric(15,2),
    perdas_b numeric(15,2),
    tempo_extra numeric(15,2),
    tempo_efic numeric(15,2),
    turno integer,
    efic numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ESTACAO  in(select * from split(:I_estacao,','))
        
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_ID
                AND G.ID            = P.GP_ID
                AND U.ID            = P.UP_ID
                AND SU.UP_ID        = P.UP_ID
                AND SU.ID           = P.ESTACAO
                AND PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin


   suspend;

  end

end;



CREATE OR ALTER procedure spi_remessa_intermediaria 
returns (
    remessa_id integer)
as
declare variable remessa_id_origem integer;
declare variable remessa_id_vinculo integer;
declare variable remessa_talao_detalhe_id integer;
declare variable observacao varchar(200);
declare variable gp_id integer;
declare variable talao_id integer;
declare variable talao_produto_descricao varchar(400);
declare variable talao_perfil_sku varchar(10);
declare variable talao_perfil_sku_descricao varchar(80);
declare variable talao_cor_classe varchar(10);
declare variable talao_cor_subclasse integer;
declare variable talao_controle varchar(4000);
declare variable talao_modelo_id integer;
declare variable talao_modelo_descricao varchar(200);
declare variable talao_tamanho integer;
declare variable talao_produto_id integer;
declare variable talao_tamanho_descricao varchar(200);
declare variable talao_quantidade numeric(18,5);
declare variable produto_descricao varchar(400);
declare variable tamanho_descricao varchar(200);
declare variable um varchar(12);
declare variable largura numeric(18,5);
declare variable comprimento numeric(18,5);
declare variable cor_classe varchar(10);
declare variable cor_subclasse integer;
declare variable id integer;
declare variable estabelecimento_id integer;
declare variable remessa_talao_id integer;
declare variable localizacao_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_alternativa numeric(18,4);
declare variable quantidade_sobra numeric(18,4);
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable status integer;
declare variable data_producao date;
declare variable data_liberacao date;
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable via_etiqueta integer;
declare variable turno char(4);
declare variable talao_extra integer;
declare variable percentual_extra numeric(18,4);
declare variable up_id integer;
declare variable estacao integer;
declare variable data date;
declare variable consumo_id integer;
declare variable consumo_quantidade numeric(15,5);
declare variable c_id_old integer;
declare variable c_id integer;
declare variable c_estabelecimento_id integer;
declare variable c_remessa_id integer;
declare variable c_remessa_talao_id integer;
declare variable c_remessa_talao_detalhe_id integer;
declare variable c_controle integer;
declare variable c_localizacao_id integer;
declare variable c_produto_id integer;
declare variable c_tamanho integer;
declare variable c_densidade integer;
declare variable c_espessura numeric(18,2);
declare variable c_quantidade_original numeric(18,4);
declare variable c_quantidade_neces numeric(18,4);
declare variable c_quantidade_neces_altern numeric(18,4);
declare variable c_fator_unidade numeric(18,8);
declare variable c_fator_unidade_altern numeric(18,8);
declare variable c_quantidade numeric(18,4);
declare variable c_quantidade_consumo numeric(18,4);
declare variable c_quantidade_saldo numeric(18,4);
declare variable c_quantidade_alternativa numeric(18,4);
declare variable c_quantidade_sobra numeric(18,4);
declare variable c_status char(4);
declare variable c_quantidade_alternativa_cons numeric(18,4);
declare variable c_quantidade_alternativa_saldo numeric(18,4);
declare variable c_datahora_conferencia timestamp;
declare variable c_componente smallint;
declare variable c_estoque_id integer;
declare variable c_saldo_baixar numeric(18,4);
declare variable tempo_total numeric(15,4);
declare variable quantidade_detalhe numeric(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '1',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (
            SELECT
                FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                T2.MODELO_ID TALAO_MODELO_ID,
                M.DESCRICAO TALAO_MODELO_DESCRICAO,
                (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                P.DESCRICAO PRODUTO_DESCRICAO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                P.UNIDADEMEDIDA_SIGLA UM,
                MT.LARGURA,
                MT.COMPRIMENTO,
                C2.CLASSE COR_CLASSE,
                C2.SUBCLASSE COR_SUBCLASSE,
                T1.ID,
                T1.ESTABELECIMENTO_ID,
                T1.REMESSA_ID,
                T1.REMESSA_TALAO_ID,
                T1.LOCALIZACAO_ID,
                T1.PRODUTO_ID,
                T1.MODELO_ID,
                P.COR_CODIGO COR_ID,
                T1.TAMANHO,
                T1.QUANTIDADE,
                T1.QUANTIDADE_ALTERNATIVA,
                T1.QUANTIDADE_SOBRA,
                T1.GP_ID,
                T1.UP_ID,
                T1.ESTACAO,
                T1.DENSIDADE,
                T1.ESPESSURA,
                T1.STATUS,
                T1.OBSERVACAO,
                T1.DATA_PRODUCAO,
                T1.DATA_LIBERACAO,
                T1.HORA_PRODUCAO,
                T1.HORA_LIBERACAO,
                T1.VIA_ETIQUETA,
                T1.TURNO,
                T1.TALAO_EXTRA,
                T1.PERCENTUAL_EXTRA
    
            FROM
                VWREMESSA_TALAO T1,
                VWREMESSA_CONSUMO C,
                TBREMESSA_CONSUMO_VINCULO V,
                VWREMESSA_TALAO T2,
                TBPRODUTO P,
                TBMODELO M,
                TBMODELO M2,
                SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                TBCOR C2
    
            WHERE
                T1.REMESSA_ID = C.REMESSA_ID
            AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
            AND V.CONSUMO_ID = C.ID
            AND T2.REMESSA_ID = V.REMESSA_ID
            AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
            AND P.CODIGO = T1.PRODUTO_ID
            AND M.CODIGO = T2.MODELO_ID
            AND M2.CODIGO = P.MODELO_CODIGO
            AND C2.CODIGO = P.COR_CODIGO
            AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   D.QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA
        );
    END


    FOR
        SELECT
            C.ID ID_OLD,
            GEN_ID(GTBREMESSA_CONSUMO,1),
            C.ESTABELECIMENTO_ID,
            :REMESSA_ID,
            V.REMESSA_TALAO_ID,
            C.REMESSA_TALAO_DETALHE_ID,
            C.CONTROLE,
            C.LOCALIZACAO_ID,
            C.PRODUTO_ID,
            C.TAMANHO,
            C.DENSIDADE,
            C.ESPESSURA,
            C.QUANTIDADE_ORIGINAL,
            C.QUANTIDADE_NECES,
            C.QUANTIDADE_NECES_ALTERN,
            C.FATOR_UNIDADE,
            C.FATOR_UNIDADE_ALTERN,
            C.QUANTIDADE,
            C.QUANTIDADE_CONSUMO,
            C.QUANTIDADE_SALDO,
            C.QUANTIDADE_ALTERNATIVA,
            C.QUANTIDADE_SOBRA,
            C.STATUS,
            C.QUANTIDADE_ALTERNATIVA_CONSUMO,
            C.QUANTIDADE_ALTERNATIVA_SALDO,
            C.DATAHORA_CONFERENCIA,
            C.COMPONENTE,
            C.ESTOQUE_ID,
            C.SALDO_BAIXAR
        
        FROM
            VWREMESSA_CONSUMO C,
            TBREMESSA_CONSUMO_VINCULO V
        
        WHERE   
            V.REMESSA_ID = :REMESSA_ID_VINCULO
        AND V.CONSUMO_ID = C.ID
        ORDER BY C.ID
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR
    DO
    BEGIN

        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            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_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :C_SALDO_BAIXAR
        );

    END




  /* Procedure Text */
--  suspend;
end;



CREATE OR ALTER procedure spi_remessa_talao_extra (
    i_remessa_id integer)
as
declare variable estabelecimento_id integer;
declare variable familia_id integer;
declare variable remessa_id integer;
declare variable remessa_talao_id integer;
declare variable matriz_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable status varchar(4);
declare variable perfil_sku varchar(10);
declare variable gp_id integer;
declare variable quantidade_total_taloes numeric(18,4);
declare variable percentual numeric(18,4);
declare variable quantidade numeric(18,4);
BEGIN

    FOR
        SELECT           
            ESTABELECIMENTO_ID, 
            FAMILIA_ID,
            REMESSA_ID,
            8000 + ROW_NUMBER() OVER() REMESSA_TALAO_ID,
            MATRIZ_ID,
            MODELO_ID,    
            COR_ID,
            PRODUTO_ID,
            TAMANHO,
            STATUS,
            PERFIL_SKU,
            GP_ID,
            QUANTIDADE_TOTAL_TALOES,
            PERCENTUAL,
            QUANTIDADE

        FROM (
            SELECT         
                ESTABELECIMENTO_ID, 
                FAMILIA_ID,     
                REMESSA_ID,
                MODELO_ID,
                MATRIZ_ID,
                PRODUTO_ID,
                COR_ID,
                TAMANHO,
                STATUS,
                PERFIL_SKU,
                GP_ID,
                QUANTIDADE_TOTAL_TALOES,
                PERCENTUAL,
                FN_ARRENDONDAR_PARA_CIMA(QUANTIDADE_TOTAL_TALOES * PERCENTUAL) QUANTIDADE
            
            FROM (
                SELECT
                    T.REMESSA                AS REMESSA_ID,
                    T.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                    T.FAMILIA_CODIGO         AS FAMILIA_ID,
                    P.MODELO_CODIGO          AS MODELO_ID,
                    T.MATRIZ_CODIGO          AS MATRIZ_ID,
                    T.PRODUTO_CODIGO         AS PRODUTO_ID,
                    P.COR_CODIGO             AS COR_ID,
                    T.TAMANHO                AS TAMANHO,
                    '1'                      AS STATUS,
                    T.PERFIL                 AS PERFIL_SKU,
                    T.PROGRAMACAO_ESTEIRA    AS GP_ID,
                    SUM(T.QUANTIDADE)        AS QUANTIDADE_TOTAL_TALOES,
                    (SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT (P.MODELO_CODIGO,P.COR_CODIGO,T.TAMANHO,T.REMESSA,0,'1')) PERCENTUAL
                
                FROM
                    TBREMESSA_ITEM_PROCESSADO T,
                    TBPRODUTO P
                
                WHERE T.REMESSA = :I_REMESSA_ID
                AND P.CODIGO  = T.PRODUTO_CODIGO
                
                GROUP BY 1,2,3,4,5,6,7,8,9,10,11
                ) X
            ) Y
        WHERE Y.QUANTIDADE > 0
    INTO    
        ESTABELECIMENTO_ID,   
        FAMILIA_ID,
        REMESSA_ID,
        REMESSA_TALAO_ID,     
        MATRIZ_ID,
        MODELO_ID,  
        COR_ID,
        PRODUTO_ID,
        TAMANHO,
        STATUS,
        PERFIL_SKU,
        GP_ID,
        QUANTIDADE_TOTAL_TALOES,
        PERCENTUAL,
        QUANTIDADE
    DO
    BEGIN
        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            ESTABELECIMENTO_CODIGO,   
            FAMILIA_CODIGO,  
            REMESSA,
            CONTROLE,
            MATRIZ_CODIGO,
            MODELO_CODIGO,
            PRODUTO_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SITUACAO,
            PERFIL,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PERCENTUAL_TALAO_EXTRA
        ) VALUES (        
            :ESTABELECIMENTO_ID, 
            :FAMILIA_ID,
            :REMESSA_ID,
            :REMESSA_TALAO_ID, 
            :MATRIZ_ID,
            :MODELO_ID,
            :PRODUTO_ID,
            :TAMANHO,
            :QUANTIDADE,
            :STATUS,
            :PERFIL_SKU,
            :GP_ID,
            0,
            :PERCENTUAL
        );
    END

END;



CREATE OR ALTER procedure spu_copia_modelo_cor1 (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    modelo_id integer,
    cor_id integer,
    tamanho integer,
    perfil varchar(10),
    status_produto char(1),
    blq_ped char(1),
    percentual_talao integer)
as
BEGIN

FOR Select A.MODELO_ID, A.COR_ID, A.PERCENTUAL_TALAO,
    Coalesce((Select First 1 P.Status From TbProduto P Where P.Modelo_Codigo = A.Modelo_Id and P.Cor_Codigo = C.Codigo),'1') Status_Produto
From TbModelo_Cor A, TbCor C
Where A.Cor_Id = C.Codigo
--  and C.Status = '1'
  and A.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :PERCENTUAL_TALAO, :Status_Produto
DO
  Begin
  IF (:MODELO_ID > 0/* and :Status_Produto = '1'*/) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_COR (MODELO_ID, COR_ID, PERCENTUAL_TALAO)
       VALUES (:ID2, :COR_ID, :PERCENTUAL_TALAO)
       MATCHING (MODELO_ID, COR_ID);
       END
  End

FOR Select M.MODELO_ID, M.COR_ID, M.TAMANHO, M.PERFIL, M.BLQ_PED
From TbModelo_Bloqueio M
Where M.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED
DO
  Begin
  IF (:MODELO_ID > 0) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_BLOQUEIO (MODELO_ID, COR_ID, TAMANHO, PERFIL, BLQ_PED)
       VALUES (:ID2, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED)
       MATCHING (MODELO_ID, COR_ID, TAMANHO);
       END
  End

END;



CREATE OR ALTER procedure spu_desaloca_agrup_pedido (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer)
returns (
    quant numeric(15,4),
    saldo numeric(15,4),
    cap_sku numeric(15,4),
    cap_cor numeric(15,4),
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

FOR

   Select A.Quantidade, A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.tabela_id, A.tab_item_id, A.tamanho
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and Agrupamento_Id = :Agrupamento_Id
      and Id = :Id
      and Saldo > 0
    Into :Quant, :Saldo, :Perfil_Sku, :Perfil_Cor, :Cap_Sku,
         :Cap_Cor, :tabela_id, :tab_item_id, :tamanho
    Do

    if (:Id > 0) then
        Begin

        if (:Quant = :Saldo) then
            Begin
            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Agrupamento_Id = :Agrupamento_Id
              and Id = :Id
              and Saldo = Quantidade;
            End else
        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - Saldo,
               Necess_Sku = (Quantidade - Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - Saldo)/:Cap_Cor,
               Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;

              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End

              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;



CREATE OR ALTER procedure spu_desaloca_agrup_pedido2 (
    estabelecimento_id integer,
    tabela_id integer,
    tab_item_id integer,
    tamanho integer)
as
declare variable quant numeric(15,4);
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable agrupamento_id integer;
declare variable id integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

FOR

   Select A.Quantidade, A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.agrupamento_id, A.id
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and tabela_id = :tabela_id
      and tab_item_id = :tab_item_id
      and tamanho = :tamanho
      and Saldo > 0
    Into :Quant, :Saldo, :Perfil_Sku, :Perfil_Cor,
         :Cap_Sku, :Cap_Cor, :agrupamento_id, :id
    Do

    if (:Id > 0) then
        Begin

        if (:Quant = :Saldo) then
            Begin
            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Agrupamento_Id = :Agrupamento_Id
              and Id = :Id
              and Saldo = Quantidade;
            End else
        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - Saldo,
               Necess_Sku = (Quantidade - Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - Saldo)/:Cap_Cor,
               Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;

              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End

              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;



CREATE OR ALTER procedure spu_desaloca_agrup_pedido3 (
    estabelecimento_id integer,
    agrupamento_id integer,
    id integer,
    quant numeric(15,4))
as
declare variable saldo numeric(15,4);
declare variable cap_sku numeric(15,4);
declare variable cap_cor numeric(15,4);
declare variable perfil_sku varchar(10);
declare variable perfil_cor varchar(10);
declare variable tabela_id integer;
declare variable tab_item_id integer;
declare variable tamanho integer;
declare variable vsaldo_gp numeric(15,4);
declare variable vsaldo_cor numeric(15,4);
declare variable vsaldo_fer numeric(15,4);
declare variable quantidade1 numeric(15,4);
declare variable necessidade1 numeric(15,4);
declare variable quantidade2 numeric(15,4);
declare variable necessidade2 numeric(15,4);
declare variable quantidade3 numeric(15,4);
declare variable necessidade3 numeric(15,4);
declare variable id1 integer;
declare variable id2 integer;
declare variable id3 integer;
BEGIN

For
   Select A.Quantidade-A.Saldo, A.Perfil_Sku, A.Perfil_Cor,
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Sku and P.Tabela = 'SKU'),
         (Select First 1 P.Cap_Produtiva From TbPerfil P Where P.Id = A.Perfil_Cor and P.Tabela = 'COR'),
          A.tabela_id, A.tab_item_id, A.tamanho
     From TbAgrupamento_Pedido A                     
    Where Estabelecimento_id = :Estabelecimento_Id 
      and Agrupamento_Id = :Agrupamento_Id
      and Id = :Id
      and Quantidade - Saldo > 0
    Into :Saldo, :Perfil_Sku, :Perfil_Cor, :Cap_Sku,
         :Cap_Cor, :tabela_id, :tab_item_id, :tamanho
    Do

    if (:Id > 0) then
        Begin

        if (Quant < Saldo) then
            Begin
            Saldo = :Quant;
            End

        if (:Saldo > 0) then
            Begin
    
              Update TbAgrupamento_Pedido Set
               Quantidade =  Quantidade - :Saldo,
               Necess_Sku = (Quantidade - :Saldo)/:Cap_Sku,
               Necess_Cor = (Quantidade - :Saldo)/:Cap_Cor 
--             Saldo = 0
               Where Estabelecimento_id = :Estabelecimento_Id
                 and Agrupamento_Id = :Agrupamento_Id
                 and Id = :Id
                 and Saldo < Quantidade;
              /*
              if (:tabela_id > 0) then
                  Begin
                  Update tbpedido_item Set
                   Agp_Dt_Cli = Null,
                   Agp_Dt_Prd = Null
                   Where Estabelecimento_Codigo = :Estabelecimento_Id
                     and Pedido   = :tabela_id
                     and Controle = :tab_item_id
                     and Tamanho  = :Tamanho;
                  End
              */
              vSaldo_Cor = :Saldo;
              vSaldo_GP  = :Saldo;
              vSaldo_Fer = :Saldo;

              if (:vSaldo_Cor > 0) then
                  Begin
                    FOR
                       Select A1.QUANTIDADE, A1.NECESSIDADE, A1.ID
                         From TBAGRUPAMENTO_CARGA_SKU_COR A1
                        Where A1.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A1.AGRUP_PED_ID = :Id
                          and A1.Quantidade > 0
                        Order By A1.Quantidade Desc
                        Into :QUANTIDADE1, :NECESSIDADE1, :ID1
                        Do
                        Begin
                           if (:vSaldo_Cor <= :QUANTIDADE1 and :vSaldo_Cor > 0) Then
                               Begin
                               update tbagrupamento_carga_sku_cor set
                               quantidade = quantidade - :vSaldo_Cor,
                               necessidade = necessidade - (:vSaldo_Cor/:Cap_Cor)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = 0;
                               End else
                           if (:vSaldo_Cor > :QUANTIDADE1) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Cor Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id1);
                               vSaldo_Cor = vSaldo_Cor - :QUANTIDADE1;
                               End
                        End
                  End
    
              if (:vSaldo_Gp > 0) then
                  Begin
                    FOR
                       Select A2.QUANTIDADE, A2.NECESSIDADE, A2.ID
                         From TBAGRUPAMENTO_CARGA_SKU_GP A2
                        Where A2.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A2.AGRUP_PED_ID = :Id
                          and A2.Quantidade > 0
                        Order By A2.Quantidade Desc
                        Into :QUANTIDADE2, :NECESSIDADE2, :ID2
                        Do
                        Begin
                           if (:vSaldo_Gp <= :QUANTIDADE2 and :vSaldo_Gp > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = Quantidade - :vSaldo_Gp,
                               Necessidade = Necessidade - (:vSaldo_Gp/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = 0;
                               End else
                           if (:vSaldo_Gp > :QUANTIDADE2) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Gp Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id2);
                               vSaldo_Gp = vSaldo_Gp - :QUANTIDADE2;
                               End
                        End
                  End
    
              if (:vSaldo_Fer > 0) then
                  Begin
                    FOR
                       Select A3.QUANTIDADE, A3.NECESSIDADE, A3.ID
                         From TBAGRUPAMENTO_CARGA_SKU_FER A3
                        Where A3.AGRUPAMENTO_ID = :Agrupamento_Id
                          and A3.AGRUP_PED_ID = :Id
                          and A3.Quantidade > 0
                        Order By A3.Quantidade Desc
                        Into :QUANTIDADE3, :NECESSIDADE3, :ID3
                        Do
                        Begin
                           if (:vSaldo_Fer <= :QUANTIDADE3 and :vSaldo_Fer > 0) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = Quantidade - :vSaldo_Fer,
                               Necessidade = Necessidade - (:vSaldo_Fer/:Cap_Sku)
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = 0;
                               End else
                           if (:vSaldo_Fer > :QUANTIDADE3) Then
                               Begin
                               UpDate TbAgrupamento_Carga_Sku_Fer Set
                               Quantidade = 0, Necessidade = 0
                               where (agrupamento_id = :agrupamento_id)
                                 and (agrup_ped_id = :Id)
                                 and (id = :id3);
                               vSaldo_Fer = vSaldo_Fer - :QUANTIDADE3;
                               End
                        End
                  End
            End
        End
End;



CREATE OR ALTER procedure spu_modelos_perdas (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO, count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    From TBREGRA_CALCULO_CUSTO h
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
     and h.familia_id = 3
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

              For
                    select
                        k.*,
                        count(k.produto_id) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO
                    from(
                        select distinct
                            a.modelo_id,
                            a.cor_id,
                            a.produto_id
                        from(
                        select distinct a.modelo_codigo
                          from tbpedido_item_processado a
                         where a.familia_codigo = 3
                           and a.data_producao between (fn_start_of_month(:DATA)) and (fn_end_of_month(:DATA))
                        
                        union
                        
                        select distinct pp.modelo_codigo modelo_id
                          from tbpedido p, tbpedido_item a, tbproduto pp
                         where a.produto_codigo = pp.codigo
                           and p.pedido = a.pedido
                           and pp.familia_codigo = 3
                           and p.data between (fn_start_of_month(:DATA)) and (fn_end_of_month(:DATA))
                        
                        union
                        
                        select distinct pp.modelo_codigo modelo_id
                          from tbnfs p, tbnfs_item a, tbproduto pp
                         where a.produto_codigo = pp.codigo
                           and a.nfs_controle = p.controle
                           and pp.familia_codigo = 3
                           and p.data_emissao between (fn_start_of_month(:DATA)) and (fn_end_of_month(:DATA))
                        ) j, tbficha_tecnica a
                        Where j.modelo_codigo = a.modelo_id
                    ) k
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO
              do Begin

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                                PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);
  DELETE FROM TBFICHA_TEMPO WHERE MES = :MES AND ANO = :ANO;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO
    From TBREGRA_CALCULO_CUSTO
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO
    Do Begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos,:vCCUSTO);           -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For Select distinct a.modelo_id, a.cor_id, a.produto_id
                from tbficha_tecnica a, TbModelo m
                Where m.codigo = a.modelo_id
                  and m.familia_codigo = :vFamilia_id
              Into :modelo_id, :cor_id, :produto_id
              do Begin

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERCENTUAL_PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos2 (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);
  DELETE FROM TBFICHA_TEMPO WHERE MES = :MES AND ANO = :ANO;

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO, count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    From TBREGRA_CALCULO_CUSTO h
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For
                    select
                        j.*,
                        count(j.produto_id) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO
                    from(
                        
                        Select distinct
                        
                            a.modelo_id,
                            a.cor_id,
                            a.produto_id
                        
                        from tbficha_tecnica a,  tbproduto k
                          Where a.produto_id = k.codigo
                          and k.familia_codigo = 133

                    ) j
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO
              do Begin

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos3 (
    estabelecimento_id integer,
    data date)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
  SELECT FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
    CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR, REMESSAS_DEFEITO,
    Count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    FROM (
    Select DISTINCT  FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
             CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
             REMESSAS_DEFEITO
        From TBREGRA_CALCULO_CUSTO h
       Where Status = '1'
       --AND FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
       and h.familia_id = 133
      Order By ID
    ) A

  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For
                    select
                        j.*,
                        count(j.produto_id) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO
                    from(
                    Select distinct
                    
                        a.modelo_id,
                        a.cor_id,
                        a.produto_id
                    
                    from tbficha_tecnica a, TbModelo m
                      Where m.codigo = a.modelo_id
                      and m.familia_codigo = :vFamilia_id
                    ) j
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO
              do Begin

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, 3, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_tempomedio_modelos_v2 (
    estabelecimento_id integer,
    data date,
    imodelo_id integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable tam integer;
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable tipo integer;
declare variable linha_id integer;
Begin

  MES  = EXTRACT(MONTH FROM :DATA);
  ANO  = EXTRACT(YEAR  FROM :DATA);

  DATA = fn_end_of_month(DATA);

  DELETE FROM TBFICHA_TEMPO WHERE MES = :MES AND ANO = :ANO and iif(:IMODELO_ID > 0, modelo_id = :IMODELO_ID, true);

  --DELETE FROM TBFICHA_TEMPO pm WHERE pm.MES = :MES AND pm.ANO = :ANO and pm.produto_id in (
  --  select p.codigo from tbproduto p where p.familia_codigo = 133
  --);

  delete from tblog_procedure h where h.tabela = 'MODELOS - '||:DATA;

  FOR
    SELECT
        FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
        CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR, REMESSAS_DEFEITO,
        Count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    FROM (
        Select DISTINCT FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
                 CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
                 REMESSAS_DEFEITO
            From TBREGRA_CALCULO_CUSTO h
           Where Status = '1'
           and iif(:IMODELO_ID > 0, h.familia_id = (select m.familia_codigo from tbmodelo m where m.codigo = :IMODELO_ID), true)
          Order By ID
    ) A

  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

        --in autonomous transaction do
        --begin

             PERCENTUAL_PERDA = 0;

             Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;
        
              --Custo Operacional por Minuto
              CUSTO_MINUTO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              MOI_PROPRIO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              MOI_ABSORVIDO= FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)
        
              For   select * from
                    (select
                         a.*
                     from SPC_PRODUTOS_CUSTO_V2(:vFamilia_id, :ANO, :MES, :IMODELO_ID) a) where iif(:IMODELO_ID > 0, modelo_id = :IMODELO_ID, true)
              Into :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO, :linha_id
              do Begin

              --in autonomous transaction do
              --begin

                 if(vFATOR > 1)then
                 begin
                    vFATOR = fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', linha_id);
                 end

                 execute procedure SPU_LOG_PROCEDURE( 'MODELOS - '||:DATA, 'Tratando Familia:'||:L_FAMILIA||'/'||:N_FAMILIA||'  Produto:'||:L_PRODUTO||'/'||:N_PRODUTO);

                 INSERT INTO TBFICHA_TEMPO (MES, ANO, MODELO_ID, COR_ID, PRODUTO_ID, TO00, TS00, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO) Values
                 (:MES, :ANO, :MODELO_ID, :COR_ID, :PRODUTO_ID, 0, 0, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO);
            
                 For Select A.Tamanho From TbGrade_Seq A, tbmodelo M Where M.Codigo = :Modelo_Id
                       and((M.Grade_codigo = 0 and Tamanho = 0) or
                           (M.t01 = '1' and Tamanho = 1) or (M.t02 = '1' and Tamanho = 2) or (M.t03 = '1' and Tamanho = 3) or (M.t04 = '1' and Tamanho = 4) or
                           (M.t05 = '1' and Tamanho = 5) or (M.t06 = '1' and Tamanho = 6) or (M.t07 = '1' and Tamanho = 7) or (M.t08 = '1' and Tamanho = 8) or
                           (M.t09 = '1' and Tamanho = 9) or (M.t10 = '1' and Tamanho =10) or (M.t11 = '1' and Tamanho =11) or (M.t12 = '1' and Tamanho =12) or
                           (M.t13 = '1' and Tamanho =13) or (M.t14 = '1' and Tamanho =14) or (M.t15 = '1' and Tamanho =15) or (M.t16 = '1' and Tamanho =16) or
                           (M.t17 = '1' and Tamanho =17) or (M.t18 = '1' and Tamanho =18) or (M.t19 = '1' and Tamanho =19) or (M.t20 = '1' and Tamanho =20))
                     Into :Tam
                     Do Begin

                         if (:vREMESSAS_DEFEITO > 0) then
                              Begin
                              PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT
                                                          (:Modelo_Id, :Cor_Id, :Tam, 0, :vREMESSAS_DEFEITO, '1')),0);
                              End

                         Delete from Tmp22040 Where True;
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
                         if (:vCALCULO_REBOBINAMENTO = '1') then
                             Begin
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :Tam, 0);
                             End
    
                             SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO(1) INTO :TOTALPROCESSO, :TOTALSETUP;
        
                             if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = :TOTALPROCESSO, TS00 = :TOTALSETUP, PERDA00 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = :TOTALPROCESSO, TS01 = :TOTALSETUP, PERDA01 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = :TOTALPROCESSO, TS02 = :TOTALSETUP, PERDA02 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = :TOTALPROCESSO, TS03 = :TOTALSETUP, PERDA03 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = :TOTALPROCESSO, TS04 = :TOTALSETUP, PERDA04 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = :TOTALPROCESSO, TS05 = :TOTALSETUP, PERDA05 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = :TOTALPROCESSO, TS06 = :TOTALSETUP, PERDA06 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = :TOTALPROCESSO, TS07 = :TOTALSETUP, PERDA07 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = :TOTALPROCESSO, TS08 = :TOTALSETUP, PERDA08 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = :TOTALPROCESSO, TS09 = :TOTALSETUP, PERDA09 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = :TOTALPROCESSO, TS10 = :TOTALSETUP, PERDA10 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = :TOTALPROCESSO, TS11 = :TOTALSETUP, PERDA11 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = :TOTALPROCESSO, TS12 = :TOTALSETUP, PERDA12 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = :TOTALPROCESSO, TS13 = :TOTALSETUP, PERDA13 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = :TOTALPROCESSO, TS14 = :TOTALSETUP, PERDA14 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = :TOTALPROCESSO, TS15 = :TOTALSETUP, PERDA15 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = :TOTALPROCESSO, TS16 = :TOTALSETUP, PERDA16 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = :TOTALPROCESSO, TS17 = :TOTALSETUP, PERDA17 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = :TOTALPROCESSO, TS18 = :TOTALSETUP, PERDA18 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = :TOTALPROCESSO, TS19 = :TOTALSETUP, PERDA19 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                             if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = :TOTALPROCESSO, TS20 = :TOTALSETUP, PERDA20 = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                         if (:vUP_PADRAO2 > 0) then
                             Begin

                             Delete from Tmp22040 Where True;
                             INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
                             if (:vCALCULO_REBOBINAMENTO = '1') then
                                 Begin
                                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :Tam, 0);
                                 End
                    
                                 SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO(1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End
                             End
    
                         if (:vCALCULO_CONFORMACAO = '1') then
                             Begin

                                 SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                                 if (:Tam = 0) then begin UPDATE TBFICHA_TEMPO SET TO00 = TO00 + :TOTALPROCESSO, TS00 = TS00 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 1) then begin UPDATE TBFICHA_TEMPO SET TO01 = TO01 + :TOTALPROCESSO, TS01 = TS01 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 2) then begin UPDATE TBFICHA_TEMPO SET TO02 = TO02 + :TOTALPROCESSO, TS02 = TS02 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 3) then begin UPDATE TBFICHA_TEMPO SET TO03 = TO03 + :TOTALPROCESSO, TS03 = TS03 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 4) then begin UPDATE TBFICHA_TEMPO SET TO04 = TO04 + :TOTALPROCESSO, TS04 = TS04 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 5) then begin UPDATE TBFICHA_TEMPO SET TO05 = TO05 + :TOTALPROCESSO, TS05 = TS05 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 6) then begin UPDATE TBFICHA_TEMPO SET TO06 = TO06 + :TOTALPROCESSO, TS06 = TS06 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 7) then begin UPDATE TBFICHA_TEMPO SET TO07 = TO07 + :TOTALPROCESSO, TS07 = TS07 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 8) then begin UPDATE TBFICHA_TEMPO SET TO08 = TO08 + :TOTALPROCESSO, TS08 = TS08 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam = 9) then begin UPDATE TBFICHA_TEMPO SET TO09 = TO09 + :TOTALPROCESSO, TS09 = TS09 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =10) then begin UPDATE TBFICHA_TEMPO SET TO10 = TO10 + :TOTALPROCESSO, TS10 = TS10 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =11) then begin UPDATE TBFICHA_TEMPO SET TO11 = TO11 + :TOTALPROCESSO, TS11 = TS11 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =12) then begin UPDATE TBFICHA_TEMPO SET TO12 = TO12 + :TOTALPROCESSO, TS12 = TS12 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =13) then begin UPDATE TBFICHA_TEMPO SET TO13 = TO13 + :TOTALPROCESSO, TS13 = TS13 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =14) then begin UPDATE TBFICHA_TEMPO SET TO14 = TO14 + :TOTALPROCESSO, TS14 = TS14 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =15) then begin UPDATE TBFICHA_TEMPO SET TO15 = TO15 + :TOTALPROCESSO, TS15 = TS15 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =16) then begin UPDATE TBFICHA_TEMPO SET TO16 = TO16 + :TOTALPROCESSO, TS16 = TS16 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =17) then begin UPDATE TBFICHA_TEMPO SET TO17 = TO17 + :TOTALPROCESSO, TS17 = TS17 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =18) then begin UPDATE TBFICHA_TEMPO SET TO18 = TO18 + :TOTALPROCESSO, TS18 = TS18 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =19) then begin UPDATE TBFICHA_TEMPO SET TO19 = TO19 + :TOTALPROCESSO, TS19 = TS19 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End else
                                 if (:Tam =20) then begin UPDATE TBFICHA_TEMPO SET TO20 = TO20 + :TOTALPROCESSO, TS20 = TS20 + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_ID = :PRODUTO_ID; End

                             END
                        END
                  --END
           END
     END
END;



CREATE OR ALTER procedure spu_tempomedio_produto (
    estabelecimento_id integer,
    data date,
    familia_producao integer,
    itamanho integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up varchar(10);
declare variable vup_padrao1 integer;
declare variable vup_padrao2 integer;
declare variable vcalculo_rebobinamento char(1);
declare variable vcalculo_conformacao char(1);
declare variable vccusto varchar(10);
declare variable vfator numeric(15,2);
declare variable vremessas_defeito integer;
declare variable vestacoes integer;
declare variable vtotal_minutos_dia integer;
declare variable vtotal_minutos_noite integer;
declare variable percentual_perda numeric(15,5);
declare variable mes integer;
declare variable ano integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable produto_id integer;
declare variable totalsetup numeric(15,4);
declare variable totalprocesso numeric(15,4);
declare variable custo_minuto numeric(18,8);
declare variable moi_proprio numeric(18,8);
declare variable moi_absorvido numeric(18,8);
declare variable vtotal_minutos integer;
declare variable n_familia integer;
declare variable l_familia integer;
declare variable n_produto integer;
declare variable l_produto integer;
declare variable nivel integer;
declare variable tamanho integer;
declare variable tratar integer;
Begin

  MES = EXTRACT(MONTH FROM :DATA);
  ANO = EXTRACT(YEAR  FROM :DATA);

  UPDATE tmpcusto_produto SET
    "TO"          = 0,
    TS            = 0,
    PERDA         = 0,
    CUSTO_MINUTO  = 0,
    MOI_PROPRIO   = 0,
    MOI_ABSORVIDO = 0
  WHERE MES = :MES AND ANO = :ANO;

  FOR
  Select FAMILIA_ID, GP_ID, PERFIL_UP, UP_PADRAO1, UP_PADRAO2,
         CALCULO_REBOBINAMENTO, CALCULO_CONFORMACAO, CCUSTO, FATOR,
         REMESSAS_DEFEITO, count(FAMILIA_ID) over() as N_FAMILIA, row_number() over()
    From TBREGRA_CALCULO_CUSTO h
   Where FAMILIA_PRODUCAO = :FAMILIA_PRODUCAO
     and Status = '1'
     --and h.familia_id = 3
  Order By Sequencia
  Into :vFAMILIA_ID,:vGP_ID,:vPERFIL_UP,:vUP_PADRAO1,:vUP_PADRAO2,
       :vCALCULO_REBOBINAMENTO, :vCALCULO_CONFORMACAO, :vCCUSTO,
       :vFATOR, :vREMESSAS_DEFEITO, :N_FAMILIA, :L_FAMILIA
    Do Begin

             PERCENTUAL_PERDA = 0;

             --Select estacoes, total_minutos_dia, total_minutos_noite, minutos
             --From spc_minutos_disponiveis (:vFamilia_id,:vGp_Id,:vPerfil_Up,:Mes,:Ano)
             --INTO :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos;

             Select
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                ESTACOES,
                MINUTOS_DIA,
                MINUTOS_NOITE,
                MINUTOS_TOTAL
             From tbcusto_minuto m
                where m.ccusto = :vCCUSTO
                and m.ano = :ANO
                and m.mes = :MES

             INTO :CUSTO_MINUTO,
                  :MOI_PROPRIO,
                  :MOI_ABSORVIDO,
                  :vestacoes,
                  :vtotal_minutos_dia,
                  :vtotal_minutos_noite,
                  :vtotal_minutos;
        
              --Custo Operacional por Minuto
              --CUSTO_MINUTO  = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,1,1,:vtotal_minutos_dia,:vCCUSTO);       -- MAO DE OBRA DIRETA
              --MOI_PROPRIO   = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,2,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA PROPRIA (LIDERES)
              --MOI_ABSORVIDO = FN_CUSTO_MINUTO (:ESTABELECIMENTO_ID,:ANO,:MES,3,:vestacoes,:vtotal_minutos,:vCCUSTO);  -- MAO DE OBRA INDIRETA ABSORVIDA (SETORES DE APOIO)

              For
                  select
                    *
                  from(
                    select
                        j.nivel,
                        j.tamanho_consumo,
                        p.modelo_codigo,
                        p.cor_codigo,
                        j.produto_consumo,
                        count(p.codigo) over() as N_PRODUTO,
                        row_number() over() as L_PRODUTO,
                        coalesce((select count(e.produto_consumo) from tmpcusto_produto e where e.produto_consumo = j.produto_consumo and e.nivel < j.nivel and e.ano = :ano and e.mes = :mes),0) AS TRATAR
                    from tmpcusto_produto j,  tbproduto p
                    where j.produto_consumo = p.codigo
                    and p.familia_codigo = :vFAMILIA_ID
                    and j.ano = :ano
                    and j.mes = :mes
                    and j.flag_tamanho = :ITAMANHO
                  ) where TRATAR = 0

              Into :nivel, :TAMANHO, :modelo_id, :cor_id, :produto_id, :N_PRODUTO, :L_PRODUTO , :TRATAR
              do Begin

                 UPDATE tmpcusto_produto SET CUSTO_MINUTO = coalesce(:CUSTO_MINUTO,0), MOI_PROPRIO = coalesce(:MOI_PROPRIO,0), MOI_ABSORVIDO = coalesce(:MOI_ABSORVIDO,0) WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;

                 if (:vREMESSAS_DEFEITO > 0) then
                      Begin
                      PERCENTUAL_PERDA = Coalesce((SELECT PERCENTUAL_DEFEITO FROM SPC_REMESSA_SKU_DEFEITO_PERCENT(:Modelo_Id, :Cor_Id, :TAMANHO, 0, 3, '1')),0);
                      End

                 Delete from Tmp22040 Where True;
                 INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, :cor_id, :TAMANHO, 1);
                 if (:vCALCULO_REBOBINAMENTO = '1') then
                     Begin
                     INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO1 ,:modelo_id, 99999, :TAMANHO, 0);
                     End

                SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                UPDATE tmpcusto_produto SET "TO" = :TOTALPROCESSO, TS = :TOTALSETUP, PERDA = :PERCENTUAL_PERDA WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;

                 if (:vUP_PADRAO2 > 0) then
                     Begin

                     Delete from Tmp22040 Where True;
                     INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, :cor_id, :TAMANHO, 1);
                     if (:vCALCULO_REBOBINAMENTO = '1') then
                         Begin
                         INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:vUP_PADRAO2 ,:modelo_id, 99999, :TAMANHO, 0);
                         End
            
                         SELECT TOTALPROCESSO * :vFATOR, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO INTO :TOTALPROCESSO, :TOTALSETUP;

                         UPDATE tmpcusto_produto SET "TO" = "TO" + :TOTALPROCESSO, TS = TS + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;
                     End

                 if (:vCALCULO_CONFORMACAO = '1') then
                     Begin

                         SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :TAMANHO, :cor_id, 1) INTO :TOTALPROCESSO, :TOTALSETUP;

                         UPDATE tmpcusto_produto SET "TO" = "TO" + :TOTALPROCESSO, TS = TS + :TOTALSETUP WHERE MES = :MES AND ANO = :ANO AND PRODUTO_CONSUMO = :PRODUTO_ID and NIVEL = :NIVEL;

                     END

               END
       END
END;



CREATE OR ALTER procedure spu_trata_pedido_data10 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
BEGIN

  Tratamento_Ped = '1';
  Maior_Data_Cliente  = Cast('01.01.2000' as Date);
  Maior_Data_Producao = Cast('01.01.2000' as Date);
  Registros = '0';
  Rem_Stat = '0';

if (Pedido_1 > 0) then
  Begin
    FOR 
    Select A.Controle,
           A.Data_Cliente, A.Data_Producao, A.Agp_Dt_Prd, A.Agp_Dt_Cli, A.Est_Min,

           Coalesce((Select First 1 Max(AGP.DATA_FINAL) From TbAgrupamento_Pedido T, TbAgrupamento AGP
                      Where T.ESTABELECIMENTO_ID = AGP.ESTABELECIMENTO_ID
                        AND T.Agrupamento_Id = AGP.Id
                        and T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and AGP.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Saldo > 0
                        and T.Tipo in ('P','M')),
                   (Select
                    (Select First 1 AGP.Data_Final From TbAgrupamento AGP
                      Where AGP.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                        and AGP.data_inicial <= X.Data
                        and AGP.data_final >= X.Data
                        and AGP.status = '1'
                        and AGP.simulacao = '0'
                        and AGP.perfil = :perfil_1) Data
                    From (
                    Select Max(Cast(R.Data_Bsc as Date)) Data
                      From tbremessa_item_alocacao T, TbRemessa R
                     Where T.ESTABELECIMENTO_ID = R.Estabelecimento_codigo
                       and T.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                       and t.Remessa = R.Numero
                       and T.Tabela_Id = A.Pedido
                       and T.Tab_Item_Id = A.Controle
                       AND T.TAMANHO = A.TAMANHO
                       and T.Tipo in ('P','M')
                       and T.Saldo > 0
                    ) X)) Data_Agrupamento,

           Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                      Where T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Status = '1'),'0') Rem_Status,
    
           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem, A.Qtd_Est, A.Qtd_Agp, A.Qtd_Rem,

           (Select First 1 P.Tipo_Pedido From TbPedido P Where a.pedido = p.pedido) Tipo_Pedido

      From TbPedido_Item A
     Where A.Pedido = :Pedido_1
       and A.Situacao = 1
       and A.Tamanho > 0
    -- For Update
     With Lock
    
    Into :Controle, :Data_Cliente, :Data_Producao, :Agp_Dt_Prd, :Agp_Dt_Cli,
         :Est_Min, :Data_Agrupamento, :Rem_Status,
         :Qtd_Prd, :Qtd_Est, :Qtd_Agp, :Qtd_Rem, :Tipo_Pedido
    Do
        
    if (:Tipo_Pedido = '1') then --Pedido Normal
        begin
        if (:Rem_Status = '0') then
             Begin
             Registros = '1';
             -- Tratamento via Est.Minimo --
             if (:Est_Min = '1') then
                  Begin
                     -- Em Estoque
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                         if (Current_Time <= Cast('15:00:59' as Time) and Current_Date = :Data_Emissao_1 and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                             Begin
                                 if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                             End else
                             Begin
                             if (Current_Date+1 >= :Maior_Data_Cliente and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                                 Begin
                                 if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                                 End else
                             if (:Data_Cliente >= :Maior_Data_Cliente) then
                                 Begin
                                  if (Maior_Data_Producao < :Data_Producao) then Maior_Data_Producao = :Data_Producao;
                                  if (Maior_Data_Cliente  < :Data_Cliente ) then Maior_Data_Cliente  = :Data_Cliente;
                                 End
                             End

                  End else
              -- Tratamento via Agrupamento --
             if (:Est_Min = '0') then
                  Begin
                     -- Em Estoque
                     if (:Qtd_Prd = 0 and :Qtd_Agp = 0 and :Qtd_Rem = 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Current_Time <= Cast('15:00:59' as Time) and Current_Date = :Data_Emissao_1) then
                              Begin
                               if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                              End else
                              Begin
                               if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                              End

                          End else
                     -- Em Agrupamento ou Producao
                     if ((:Qtd_Prd = 0) and (:Qtd_Agp > 0 or :Qtd_Rem > 0)) then
                          Begin

                          --
                          --if (Agp_Dt_Prd is not null) then
                          if (Data_Producao is not null) then
                              begin
                          --  Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Agp_Dt_Prd));
                              Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Data_Producao));
                              end

                          Update TbPedido_Item Set
                          Agp_Dt_Prd = :Data_Agrupamento,
                          Agp_Dt_Cli = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Maior_Data_Producao < :Data_Agrupamento) then
                              Maior_Data_Producao = :Data_Agrupamento;
                          if (Maior_Data_Cliente  < :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))) then
                              Maior_Data_Cliente  = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao));

                          if (Maior_Data_Producao <= :Data_Emissao_1) then
                              Begin
                              Maior_Data_Producao = :Data_Producao;
                              Maior_Data_Cliente  = :Data_Cliente;
                              End

                          End else
                     -- A Produzir > 0
                     if (:Qtd_Prd > 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          Tratamento_Ped = '0'; --Pedido precisa ser tratado
                          End
                  End
             End

        End
  End

  if (:Registros = '1' and :Rem_Stat = '0') then
      Begin

      if (:Tratamento_Ped = '0') Then
           Begin
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBPEDIDO', :PEDIDO_1,
          (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),
           'Ha itens com pendencias que evitaram a conclusao no tratamento do pedido');
           End
    
      if (:Tratamento_Ped = '1') Then
           Begin

           If ((:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) or (:Programado_1 = '0' )) Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao,
               Data_Cliente = :Maior_Data_Cliente
               Where Pedido = :Pedido_1;
               End else

           If (:Programado_1 = '1') Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao
               Where Pedido = :Pedido_1
                 and Data_Entrega < :Maior_Data_Producao;
               End

           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
           'TBPEDIDO', :PEDIDO_1,
           (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),
           'Pedido tratado por completo');

           if (:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) Then
               Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO', :PEDIDO_1,
              (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),
               'O tratamento de itens forcou a alteracao da data do cliente no Pedido Programado');
               End
           End

      End

End;



CREATE OR ALTER procedure spu_trata_pedido_data11 (
    pedido_1 integer,
    data_emissao_1 date,
    data_cliente_1 date,
    perfil_1 varchar(10),
    programado_1 char(1))
returns (
    controle integer,
    data_cliente date,
    data_producao date,
    agp_dt_prd date,
    agp_dt_cli date,
    est_min char(1),
    data_agrupamento date,
    rem_status char(1),
    qtd_prd numeric(15,4),
    qtd_est numeric(15,4),
    qtd_agp numeric(15,4),
    qtd_rem numeric(15,4),
    tipo_pedido char(1))
as
declare variable rem_stat char(1);
declare variable registros char(1);
declare variable tratamento_ped char(1);
declare variable maior_data_cliente date;
declare variable maior_data_producao date;
declare variable vhora time;
BEGIN

  Tratamento_Ped = '1';
  Maior_Data_Cliente  = Cast('01.01.2000' as Date);
  Maior_Data_Producao = Cast('01.01.2000' as Date);
  Registros = '0';
  Rem_Stat = '0';

  vHora = Cast((Select First 1 Valor_Ext From TbControle_n Where ID = 234) as Time);

if (Pedido_1 > 0) then
  Begin
    FOR 
    Select A.Controle,
           A.Data_Cliente, A.Data_Producao, A.Agp_Dt_Prd, A.Agp_Dt_Cli, A.Est_Min,

           Coalesce((Select First 1 Max(AGP.DATA_FINAL) From TbAgrupamento_Pedido T, TbAgrupamento AGP
                      Where T.ESTABELECIMENTO_ID = AGP.ESTABELECIMENTO_ID
                        AND T.Agrupamento_Id = AGP.Id
                        and T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and AGP.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Saldo > 0
                        and T.Tipo in ('P','M')),
                   (Select
                    (Select First 1 AGP.Data_Final From TbAgrupamento AGP
                      Where AGP.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                        and AGP.data_inicial <= X.Data
                        and AGP.data_final >= X.Data
                        and AGP.status = '1'
                        and AGP.simulacao = '0'
                        and AGP.perfil = :perfil_1) Data
                    From (
                    Select Max(Cast(R.Data_Bsc as Date)) Data
                      From tbremessa_item_alocacao T, TbRemessa R
                     Where T.ESTABELECIMENTO_ID = R.Estabelecimento_codigo
                       and T.estabelecimento_id = A.ESTABELECIMENTO_CODIGO
                       and t.Remessa = R.Numero
                       and T.Tabela_Id = A.Pedido
                       and T.Tab_Item_Id = A.Controle
                       AND T.TAMANHO = A.TAMANHO
                       and T.Tipo in ('P','M')
                       and T.Saldo > 0
                    ) X)) Data_Agrupamento,

           Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                      Where T.Tabela_Id = A.Pedido
                        and T.Tab_Item_Id = A.Controle
                        and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                        AND T.TAMANHO = A.TAMANHO
                        and T.Status = '1'),'0') Rem_Status,
    
           Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                      Where C.Pedido = A.Pedido
                        and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
           -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem, A.Qtd_Est, A.Qtd_Agp, A.Qtd_Rem,

           (Select First 1 P.Tipo_Pedido From TbPedido P Where a.pedido = p.pedido) Tipo_Pedido

      From TbPedido_Item A
     Where A.Pedido = :Pedido_1
       and A.Situacao = 1
       and A.Tamanho > 0
    -- For Update
     With Lock
    
    Into :Controle, :Data_Cliente, :Data_Producao, :Agp_Dt_Prd, :Agp_Dt_Cli,
         :Est_Min, :Data_Agrupamento, :Rem_Status,
         :Qtd_Prd, :Qtd_Est, :Qtd_Agp, :Qtd_Rem, :Tipo_Pedido
    Do
        
    if (:Tipo_Pedido = '1') then --Pedido Normal
        begin
        if (:Rem_Status = '0') then
             Begin
             Registros = '1';
             -- Tratamento via Est.Minimo --
             if (:Est_Min = '1') then
                  Begin
                     -- Em Estoque
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                         if (Current_Time <= :vHora and Current_Date = :Data_Emissao_1 and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                             Begin
                                 if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                             End else
                             Begin
                             if (Current_Date+1 >= :Maior_Data_Cliente and :Qtd_Prd = 0 and :Qtd_Rem = 0) then
                                 Begin
                                 if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                                 if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                                 End else
                             if (:Data_Cliente >= :Maior_Data_Cliente) then
                                 Begin
                                  if (Maior_Data_Producao < :Data_Producao) then Maior_Data_Producao = :Data_Producao;
                                  if (Maior_Data_Cliente  < :Data_Cliente ) then Maior_Data_Cliente  = :Data_Cliente;
                                 End
                             End

                  End else
              -- Tratamento via Agrupamento --
             if (:Est_Min = '0') then
                  Begin
                     -- Em Estoque
                     if (:Qtd_Prd = 0 and :Qtd_Agp = 0 and :Qtd_Rem = 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null 
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Current_Time <= :vHora and Current_Date = :Data_Emissao_1) then
                              Begin
                               if (Maior_Data_Producao < Current_Date) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date) then Maior_Data_Cliente  = Current_Date;
                              End else
                              Begin
                               if (Maior_Data_Producao < Current_Date  ) then Maior_Data_Producao = Current_Date;
                               if (Maior_Data_Cliente  < Current_Date+1) then Maior_Data_Cliente  = Current_Date+1;
                              End

                          End else
                     -- Em Agrupamento ou Producao
                     if ((:Qtd_Prd = 0) and (:Qtd_Agp > 0 or :Qtd_Rem > 0)) then
                          Begin

                          --
                          --if (Agp_Dt_Prd is not null) then
                          if (Data_Producao is not null) then
                              begin
                          --  Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Agp_Dt_Prd));
                              Data_Agrupamento = :Data_Agrupamento - (Extract (WeekDay from :Data_Agrupamento) - Extract (WeekDay from :Data_Producao));
                              end

                          Update TbPedido_Item Set
                          Agp_Dt_Prd = :Data_Agrupamento,
                          Agp_Dt_Cli = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          if (Maior_Data_Producao < :Data_Agrupamento) then
                              Maior_Data_Producao = :Data_Agrupamento;
                          if (Maior_Data_Cliente  < :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao))) then
                              Maior_Data_Cliente  = :Data_Agrupamento + (Abs(:Data_Cliente-:Data_Producao));

                          if (Maior_Data_Producao <= :Data_Emissao_1) then
                              Begin
                              Maior_Data_Producao = :Data_Producao;
                              Maior_Data_Cliente  = :Data_Cliente;
                              End

                          End else
                     -- A Produzir > 0
                     if (:Qtd_Prd > 0) then
                          Begin
                          Update TbPedido_Item Set
                          Agp_Dt_Cli = Null,
                          Agp_Dt_Prd = Null
                          Where Pedido = :Pedido_1
                            and Controle = :Controle;

                          Tratamento_Ped = '0'; --Pedido precisa ser tratado
                          End
                  End
             End

        End
  End

  if (:Registros = '1' and :Rem_Stat = '0') then
      Begin

      if (:Tratamento_Ped = '0') Then
           Begin
           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBPEDIDO', :PEDIDO_1,
          (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),
           'Ha itens com pendencias que evitaram a conclusao no tratamento do pedido');
           End
    
      if (:Tratamento_Ped = '1') Then
           Begin

           If ((:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) or (:Programado_1 = '0' )) Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao,
               Data_Cliente = :Maior_Data_Cliente
               Where Pedido = :Pedido_1;
               End else

           If (:Programado_1 = '1') Then
               Begin
               Update TbPedido Set
               Data_Entrega = :Maior_Data_Producao
               Where Pedido = :Pedido_1
                 and Data_Entrega < :Maior_Data_Producao;
               End

           INSERT INTO TBHISTORICO (
           TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
           'TBPEDIDO', :PEDIDO_1,
           (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),
           'Pedido tratado por completo');

           if (:Programado_1 = '1' and :Data_Cliente_1 < :Maior_Data_Cliente) Then
               Begin
               INSERT INTO TBHISTORICO (
               TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
              'TBPEDIDO', :PEDIDO_1,
              (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),
               'O tratamento de itens forcou a alteracao da data do cliente no Pedido Programado');
               End
           End

      End

End;



CREATE OR ALTER procedure spu_trata_pedido_remessa5 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End;



CREATE OR ALTER procedure spu_trata_pedido_remessa6 (
    pedido_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer)
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
declare variable aloc_mult char(1);
BEGIN

  aloc_mult = Coalesce((Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                 From TbPedido P, TbPerfil PF
                Where P.Pedido = :Pedido_1
                  and P.Classificacao = PF.Id
                  and PF.Tabela = 'PED'),'0');

FOR 
Select A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
       A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--     Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

       Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                  Where T.Tabela_Id = A.Pedido
                    and T.Tab_Item_Id = A.Controle
                    and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                    AND T.TAMANHO = A.TAMANHO
                    and T.Status = '1'),'0') Rem_Status,

       Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                  Where C.Pedido = A.Pedido
                    and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
       -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult


  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :Qtd_Mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin

           vQtd_Prd = :Qtd_Prd;
           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data

                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                      Begin

                      if (:ID > 0) then
                           Begin

                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
                    
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                        --Exit;
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
                                        if (:AGRUPAMENTO_ID > 0) Then-- and :Tratamento_Pedido = '2') then
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                              End
                          End
                    End
           End
     End
End;



CREATE OR ALTER procedure spu_trata_ped_item_remessa5 (
    pedido_1 integer,
    controle_1 integer,
    alocdesaloc char(1))
returns (
    estabelecimento_id integer,
    pedido integer,
    controle integer,
    produto_id integer,
    localizacao_id integer,
    tamanho integer,
    perfil_sku varchar(10),
    perfil_cor varchar(10),
    rem_status char(1),
    qtd_prd numeric(15,4),
    remessa integer,
    talao integer,
    agrupamento_id integer,
    agrup_ped_id integer,
    id integer,
    qtd_disp numeric(15,4),
    qtd_mult integer,
    aloc_mult char(1))
as
declare variable vqtd_prd integer;
declare variable vqtd_disp integer;
BEGIN
    
FOR
Select First 1 A.Estabelecimento_Codigo, A.Pedido, A.Controle, A.Produto_Codigo,
               A.Localizacao_Id, A.Tamanho, A.Perfil, A.Perfil_Cor,

--               Coalesce((Select First 1 P.Tratamento_Pedido From TbPerfil P
--                          Where P.Id = A.Perfil and P.Tabela = 'SKU'),'2'),

               Coalesce((Select First 1 T.Status From TbRemessa_Item_Tratamento T
                          Where T.Tabela_Id = A.Pedido
                            and T.Tab_Item_Id = A.Controle
                            and T.ESTABELECIMENTO_ID = A.ESTABELECIMENTO_CODIGO
                            AND T.TAMANHO = A.TAMANHO
                            and T.Status = '1'),'0') Rem_Status,

               Coalesce((Select First 1 C.Quantidade From TbPedido_Item_Saldo C
                          Where C.Pedido = A.Pedido
                            and C.PEDIDO_ITEM_CONTROLE = A.Controle),0.0000)
               -A.Qtd_Est-A.Qtd_Agp-A.Qtd_Rem,

       Coalesce((Select First 1 IIF(A.TAMANHO = 1,MPC.MU01,IIF(A.TAMANHO = 2,MPC.MU02,
                                IIF(A.TAMANHO = 3,MPC.MU03,IIF(A.TAMANHO = 4,MPC.MU04,
                                IIF(A.TAMANHO = 5,MPC.MU05,IIF(A.TAMANHO = 6,MPC.MU06,
                                IIF(A.TAMANHO = 7,MPC.MU07,IIF(A.TAMANHO = 8,MPC.MU08,
                                IIF(A.TAMANHO = 9,MPC.MU09,IIF(A.TAMANHO =10,MPC.MU10,
                                IIF(A.TAMANHO =11,MPC.MU11,IIF(A.TAMANHO =12,MPC.MU12,
                                IIF(A.TAMANHO =13,MPC.MU13,IIF(A.TAMANHO =14,MPC.MU14,
                                IIF(A.TAMANHO =15,MPC.MU15,IIF(A.TAMANHO =16,MPC.MU16,
                                IIF(A.TAMANHO =17,MPC.MU17,IIF(A.TAMANHO =18,MPC.MU18,
                                IIF(A.TAMANHO =19,MPC.MU19,IIF(A.TAMANHO =20,MPC.MU20,
                                1))))))))))))))))))))
                   From TBMODELO_PEDIDO_COTA MPC Where Modelo_Id = A.Modelo_Codigo),1) Qtd_Mult,

                  (Select First 1 Coalesce(PF.Alocar_Multiplo,'0')
                     From TbPedido P, TbPerfil PF
                    Where P.Pedido = A.Pedido
                      and P.Classificacao = PF.Id
                      and PF.Tabela = 'PED') aloc_mult

  From TbPedido_Item A
 Where Pedido = :Pedido_1
   and Controle = :Controle_1
   and Situacao = 1
   and Tamanho > 0
 --For Update
   With Lock

Into :Estabelecimento_Id, :Pedido, :Controle, :Produto_Id, :Localizacao_Id,
     :Tamanho, :Perfil_Sku, :Perfil_Cor, /*:Tratamento_Pedido,*/ :Rem_Status, :Qtd_Prd, :qtd_mult, :aloc_mult
Do
    
if (:Rem_Status = '0') then
     Begin

      if (:AlocDesaloc = 'D') then
          Begin
            Update tbremessa_item_alocacao Set
            Tabela_Id = 0,
            Tab_Item_Id = 0
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_id =  :Pedido
              and Tab_item_id = :Controle
            --and Tipo = 'P'
              and Tamanho = :Tamanho
              and Saldo > 0;

            Delete from TbAgrupamento_Pedido 
            Where Estabelecimento_id = :Estabelecimento_Id
              and Tabela_Id = :Pedido
              and Tab_Item_Id = :Controle
              and Saldo = 0
              and Tipo = 'M';

            Execute Procedure SPU_DESALOCA_AGRUP_PEDIDO2(:Estabelecimento_Id,:Pedido,:Controle,:Tamanho);
          End
        
      if (:AlocDesaloc = 'A') then
           Begin
    
           vQtd_Prd = Trunc(:Qtd_Prd);

           if (Mod(:vQtd_Prd,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
               Begin
               :vQtd_Prd = :vQtd_Prd - (Mod(:vQtd_Prd,:Qtd_Mult));
               End

           if (:aloc_mult <> '1') Then
               Begin
               Qtd_Mult = 1;
               End

           if (:vQtd_Prd > 0) then
              Begin
        
              Agrup_Ped_Id = 0;

              For
                Select B.Remessa, B.Talao, B.Agrupamento_Id, B.Id, B.Saldo
                From TbRemessa_Item_Alocacao B, TbPedido_item_Processado A, TbRemessa R
                Where B.Estabelecimento_Id = :Estabelecimento_Id
                and B.Remessa = R.Numero
                and B.Localizacao_Id = :Localizacao_Id
                and B.Tabela_Id = 0
                and B.TAMANHO = :Tamanho
                and B.Status = '1'
                and B.Produto_Id = :Produto_Id
                and A.Remessa = B.Remessa
                and A.Controle = B.Talao
                and A.Estabelecimento_Codigo = B.Estabelecimento_Id
                and A.Situacao < 3
                and A.Data_Expedicao is Null
                and B.Saldo >= :Qtd_Mult
                Order By R.Data
                 Into :Remessa, :Talao, :Agrupamento_Id, :Id, :Qtd_Disp
                    Do
                       Begin
    
                        if (:Id > 0) then
                            Begin
    
                                vQtd_Disp = :Qtd_Disp;
                                --VERIFICA SE QUANTIDADE DISPONIVEL AO MULTIPLI DA QUANTIDADE PADRAO
                                if (Mod(:vQtd_Disp,:Qtd_Mult) > 0 and :aloc_mult = '1') Then
                                    Begin
                                     :vQtd_Disp = :vQtd_Disp - (Mod(:vQtd_Disp,:Qtd_Mult));
                                    End
            
                                if (:vQtd_Prd > 0 and :vQtd_Disp > 0) then
                                    Begin
            
                                    IF (:vQtd_Prd < :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then -- and :Tratamento_Pedido = '2') then
                                            Begin
                                            Update TBREMESSA_ITEM_ALOCACAO set Saldo = Saldo - :vQtd_Prd
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Prd,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Prd
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Prd,
                                            :vQtd_Prd, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        :vQtd_Prd = 0;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
            
                                       End else
                                    IF (:vQtd_Prd >= :vQtd_Disp) Then
                                       Begin
            
                                        if (:AGRUPAMENTO_ID > 0) Then 
                                            Begin
                                            DELETE FROM TBREMESSA_ITEM_ALOCACAO
                                            Where Estabelecimento_Id = :Estabelecimento_Id
                                            and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                            and Id = :Id;
            
                                            if (:Agrup_Ped_Id = 0) then
                                                Begin
                                                    Agrup_Ped_Id = gen_id(gtbagrupamento_pedido,1);
            
                                                    INSERT INTO TbAgrupamento_Pedido (
                                                    Estabelecimento_Id, AGRUPAMENTO_ID, ID, TABELA_ID,
                                                    TAB_ITEM_ID, PRODUTO_ID, TAMANHO, QUANTIDADE,
                                                    SALDO, TIPO, REMESSA,
                                                    PERFIL_SKU, NECESS_SKU, PERFIL_COR, NECESS_COR) VALUES (
                                                    :Estabelecimento_Id, :AGRUPAMENTO_ID, :Agrup_Ped_Id,
                                                    :Pedido, :Controle, :PRODUTO_ID, :TAMANHO, :vQtd_Disp,
                                                    0, 'M', 0, :PERFIL_SKU, 0, :PERFIL_COR, 0);
                                                End else
                                                Begin
                                                    UPDATE TbAgrupamento_Pedido SET
                                                    Quantidade = Quantidade + :vQtd_Disp
                                                    Where Estabelecimento_Id = :Estabelecimento_Id
                                                    and AGRUPAMENTO_ID = :AGRUPAMENTO_ID
                                                    and ID = :Agrup_Ped_Id
                                                    and TABELA_ID = :Pedido
                                                    and TAB_ITEM_ID = :Controle
                                                    and Tipo = 'M';
                                                End
            
                                            Insert into TBREMESSA_ITEM_ALOCACAO (
                                            estabelecimento_id, tabela_id, tab_item_id, tipo,
                                            localizacao_id, produto_id, tamanho, Quantidade, Saldo,
                                            Remessa, Talao, Agrupamento_Id, Agrup_Ped_Id)
                                            values (:estabelecimento_id, :Pedido, :Controle, 'P',
                                            :localizacao_id, :produto_id, :tamanho, :vQtd_Disp,
                                            :vQtd_Disp, :Remessa, :Talao, :Agrupamento_Id, :Agrup_Ped_Id);
                                            End
            
                                        :vQtd_Prd = :vQtd_Prd - :vQtd_Disp;
            
                                        Delete From TbPedido_Consumo
                                        Where Estabelecimento_Id = :Estabelecimento_Id
                                          and Pedido_Id = :Pedido
                                          and Pedido_Item_Id = :Controle
                                          and Tamanho_Item = :Tamanho
                                          and Tipo = 'C';
                                       End
                    
                                   End
                           End
                        End
                   End
           End
     End
End;

