CREATE OR ALTER function fn_programacao_tempo_novo (
    modelo_id integer,
    cor_id integer,
    tam integer,
    tipo integer)
returns numeric(14,4)
as
declare variable totalsetup2 integer;
declare variable totalsetup1 integer;
declare variable totalsetup3 numeric(14,4);
declare variable resultado numeric(14,4);
declare variable totalprocesso1 numeric(14,4);
declare variable totalprocesso2 integer;
declare variable totalprocesso3 integer;
declare variable id integer;
declare variable familia_producao integer;
declare variable sequencia integer;
declare variable familia_id integer;
declare variable gp_id varchar(40);
declare variable perfil_up char(4);
declare variable up_padrao1 integer;
declare variable up_padrao2 integer;
declare variable calculo_rebobinamento char(4);
declare variable calculo_conformacao char(4);
declare variable ccusto varchar(40);
declare variable fator numeric(18,2);
declare variable status char(4);
declare variable remessas_defeito integer;
begin

end;

CREATE OR ALTER procedure spu_custo_despesa (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer)
returns (
    ret_contas numeric(18,8),
    total_contas numeric(18,8))
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable preco_venda2 numeric(15,4);
declare variable contas numeric(18,8);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
declare variable moeda varchar(3);
declare variable taxa_dolar numeric(15,4);
declare variable calculo_frete varchar(1000);
declare variable tipo_frete3 integer;
declare variable tipo_calculo integer;
Begin

end;

CREATE OR ALTER procedure spu_custo_minuto (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
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

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 char(1);
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

end;

CREATE OR ALTER procedure spu_pedido_margem_contrib_v2 (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer,
    imodelo_id integer = 0,
    tipo_calculo integer = 0)
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable preco_venda2 numeric(15,4);
declare variable contas numeric(18,4);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
declare variable moeda varchar(3);
declare variable taxa_dolar numeric(15,4);
declare variable calculo_frete varchar(1000);
declare variable tipo_frete3 integer;
declare variable percentual_contas numeric(15,2);
declare variable old_contas numeric(18,4);
Begin

end;

CREATE OR ALTER procedure spu_pedido_margem_contrib_v3 (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer,
    imodelo_id integer = 0,
    tipo_calculo integer = 0)
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable contas numeric(18,4);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
Begin

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 char(1);
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

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 char(1);
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

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 char(1);
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


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 char(1);
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

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 char(1);
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


end;

ALTER TABLE TBREGRA_CALCULO_CUSTO ADD OLD_PERFIL VARCHAR(10) DEFAULT '%';
update TBREGRA_CALCULO_CUSTO set OLD_PERFIL = PERFIL_UP;
ALTER TABLE TBREGRA_CALCULO_CUSTO DROP PERFIL_UP;
ALTER TABLE TBREGRA_CALCULO_CUSTO ADD PERFIL_UP VARCHAR(10) DEFAULT '%';
update TBREGRA_CALCULO_CUSTO set PERFIL_UP = OLD_PERFIL;
ALTER TABLE TBREGRA_CALCULO_CUSTO DROP OLD_PERFIL;

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 char(1);
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_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 char(1);
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_modelos3 (
    estabelecimento_id integer,
    data date)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
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_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 char(1);
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_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 char(1);
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_pedido_margem_contrib_v3 (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer,
    imodelo_id integer = 0,
    tipo_calculo integer = 0)
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable contas numeric(18,4);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
Begin

  :CONTAS   = 0;
  :GP_ID    = '';
  :MINUTOS  = 0;
  :PERFIL_UP= '';
  :FATURAMENTO_FAMILIA = 0;

  if(TIPO_CALCULO = 0)then
  begin
      :ANO = extract(year from  :DATA_1);
      :MES = extract(Month from :DATA_2);
    
      :DATA_DESPESA1 = dateadd(month, (MESES - 1) * -1, :DATA_1);
      :DATA_DESPESA2 = DATA_2;
  end else
  begin
      :ANO = extract(year from  dateadd(month, -1,:DATA_1));
      :MES = extract(Month from dateadd(month, -1,:DATA_1));
    
      :DATA_DESPESA1 = dateadd(month, (MESES - 1) * -1, dateadd(month, -1,:DATA_1));
      :DATA_DESPESA2 = DATA_2;
  end

  :ANO0 = extract(year from  :DATA_DESPESA1);
  :MES0 = extract(Month from :DATA_DESPESA1);

  for
    select first 1
        PERCENTUAL_IR
    from TBCUSTO_INCENTIVO v where v.PERCENTUAL = 0
  into
    :PERCENTUAL_IR
  do begin
    --IR
  end

  for
    SELECT
        first 1
        c.GP_ID,
        c.PERFIL_UP,
        c.fator_setup
    from TBREGRA_CALCULO_CUSTO c
    where c.familia_id = :FAMILIA_ID
  into
    :GP_ID, :PERFIL_UP, :FATOR_SETUP
  do begin
    --configuracoes
  end

  for
    SELECT
        MINUTOS / :MESES
    from
        spc_minutos_disponiveis2(:FAMILIA_ID,:GP_ID,:PERFIL_UP,:MES0,:ANO0,:MES,:ANO)
  into
    :MINUTOS
  do begin
    --minutos disponiveis
  end

  for
    select (FAMILIA / TOTAL) as FATURAMENTO_FAMILIA
          from (select
            sum(iif(f.familia_id = cast(:FAMILIA_ID as integer), f.faturamento, 0)) FAMILIA,
            sum(f.faturamento) as TOTAL
        from tbfamilia_faturamento f where fn_start_of_month('01.'||f.mes||'.'||f.ano) between  :DATA_DESPESA1 and :DATA_DESPESA2)
  into
    :FATURAMENTO_FAMILIA
  do begin
    --faturamento da familia
  end

  for
    select
        sum(kk.valor) / :MESES
    from(
        select
            d.valor
        from tbdespesa_historico d
        where fn_start_of_month('01.'||d.mes||'.'||d.ano) between :DATA_DESPESA1 and :DATA_DESPESA2
        and d.conta <> ''
    ) kk
  into
    :CONTAS
  do begin
     :CONTAS = cast((:CONTAS * :FATURAMENTO_FAMILIA) / iif(:MINUTOS > 0, :MINUTOS, 1) as numeric(18,8));
  end

  delete from tblog_procedure h where h.tabela = 'MARGEM PEDIDO - '||formatdate(:DATA_1);

  For
     select
        CLIENTE_CODIGO,
        DATA,
        PRODUTO_CODIGO,
        TAMANHO,
        EST_MIN,
        MODELO_CODIGO,
        COR_ID,
    
        SUM(Quantidade) as Quantidade,
        avg(PRECO_VENDA) as PRECO_VENDA,
        avg(margem) as margem,
        count(Cliente_Codigo) over() as N_PRODUTO,
        row_number() over() as L_PRODUTO,
        iif(SUM(QTD_NOTA) > 0, avg(coalesce(FRETE,0)) / SUM(QTD_NOTA),0) as FRETE,
        list(nfs_controle,',') as nfs_controle,
        avg(comissao) as comissao
    
    from(
        select
            CLIENTE_CODIGO,
            DATA,
            PRODUTO_CODIGO,
            TAMANHO,
            EST_MIN,
            MODELO_CODIGO,
            COR_ID,
    
            avg(Quantidade) as Quantidade,
            (avg(valor) + avg(margem)) as PRECO_VENDA,
            avg(margem) as margem,
            iif(SUM(QTD_NOTA) > 0, avg(coalesce(FRETE,0)) / SUM(QTD_NOTA),0) as FRETE,
            SUM(QTD_NOTA) as QTD_NOTA,
            list(nfs_controle,',') as nfs_controle,
            avg(comissao) as comissao
    
        from(
            Select distinct
                pi.controle,
                P.Cliente_Codigo,
                P.Data,
                PI.Produto_Codigo,
                PI.Tamanho,
                PI.EST_MIN,
                PI.Quantidade,
                pi.valor,
                pi.margem,
                pi.modelo_codigo,
                pi.cor_id,
                I.Quantidade as QTD_NOTA,
                i.valor_frete_rateado as FRETE,
                i.nfs_controle,
               coalesce((select comissao from  tbrepresentante r where r.codigo = p.representante_codigo),0) as comissao
            
               From TbPedido P, TbPedido_Item PI
               left join TBNFS_ITEM I on i.pedido_item_pe_controle = pi.controle and i.pedido = pi.pedido
            
                Where P.Data between :Data_1 and :Data_2
                  and P.Pedido = PI.Pedido
                  and P.familia_codigo = :Familia_Id
                  and iif(:IMODELO_ID > 0, pi.modelo_codigo = :IMODELO_ID, true)

                  --and p.pedido in (173993,174046,177503,175740,178066,176336)
                  --and p.cliente_codigo = 793
                  --and pi.cor_id = 81
                  --and pi.tamanho = 10
      ) kk
        Group By controle, Cliente_Codigo, Data, Produto_Codigo, Tamanho, Est_Min, modelo_codigo, cor_id
  ) kk
        Group By Cliente_Codigo, Data, Produto_Codigo, Tamanho, Est_Min, modelo_codigo, cor_id


  INTO :Cliente_ID, :Data, :Produto_Id, :Tamanho, :Est_Min, :MODELO_ID, :COR_ID, :Quantidade, :PRECO_VENDA, :MARGEM, :N_PRODUTO, :L_PRODUTO, :VALOR_FRETE, :nfs_controle, :COMISSAO
  Do Begin

        execute procedure SPU_LOG_PROCEDURE( 'MARGEM PEDIDO - '||formatdate(:DATA_1) , 'Tratando: '||:L_PRODUTO||'/'||:N_PRODUTO);


        UPDATE OR INSERT INTO TBPEDIDO_ITEM_CUSTO (MARGEM, VALOR, C_MPR, C_STP, C_MOD, C_MOI_PR, C_MOI_AB, PERCENTUAL_PERDA, CONTAS, COMISSAO, FRETE, TRIBUTOS, PERCENTUAL_IR, DATA, CLIENTE, PRODUTO_ID, TAMANHO)
                                   VALUES (0, :PRECO_VENDA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, :Data, :Cliente_ID, :Produto_Id, :Tamanho)
                                 MATCHING (DATA, CLIENTE, PRODUTO_ID, TAMANHO);

          :MERCADO = Coalesce((
                            Select First 1
                            Coalesce((Select First 1 CCP.Custo_Padrao_Id
                               From TbCliente_Custo_Padrao CCP
                              Where CCP.Cliente_Id = C.Codigo
                                and CCP.Familia_Id = :Familia_Id),
                            Coalesce(
                            (Select First 1 CCP.Custo_Padrao_Id
                               From TbCliente_Custo_Padrao CCP
                              Where CCP.UF = C.UF
                                and CCP.Cliente_Id = 0
                                and CCP.Familia_Id = :Familia_Id),
                            (Select First 1 CCP.Custo_Padrao_Id
                               From TbCliente_Custo_Padrao CCP
                              Where CCP.UF = 'XX'
                                and CCP.Familia_Id = :Familia_Id))) Custo_Padrao_Id
                              From TbCliente C
                            Where C.Codigo = :Cliente_ID),10);

          :TRIBUTOS             = 0;
          :FRETE                = 0;
          :PERC_FRETE           = 0;
          :CUSTO_FRETE_RATEADO  = 0;
          :VALOR_FRETE2         = 0;
          :TIPO_FRETE           = 0;

          for
            select
                sum(iif(frete = 0 and comissao = 0 , percentual,0)) as TRIBUTOS,
                sum(iif(frete = 1                  , percentual,0)) as FRETE
            from(
                select
                    FRETE,
                    COMISSAO,
                    iif(:MARGEM > 0 and y.margem = 1, iif(y.usar_fator = 1,(y.fator/y.avos) * PERCENTUAL,PERCENTUAL), iif(y.usar_fator = 1,(y.fator/y.avos) * PERCENTUAL,PERCENTUAL))  as  PERCENTUAL
                from TBCUSTO_PADRAO_ITEM y
                where y.padrao_id = :MERCADO
            )
          into
            :TRIBUTOS, :PERC_FRETE--, :COMISSAO
          do begin
             --configuracoes do mercado

             if(:MARGEM = 0)then
             begin
                :TRIBUTOS = (:TRIBUTOS /100) * :PRECO_VENDA;
                :COMISSAO = (:COMISSAO /100) * :PRECO_VENDA;
             end else
             begin
                :TRIBUTOS = (:TRIBUTOS /100) * (:PRECO_VENDA - :MARGEM);
                :COMISSAO = (:COMISSAO /100) * :PRECO_VENDA;
             end

          end

          CONT_FRETE = 0;

           for
            select
                coalesce(i.custo_frete_rateado,0) as custo_frete_rateado,
                coalesce(i.valor_frete,0) as valor_frete,
                (select first 1 s.frete from tbnfs_transportadora s where s.nfs_controle = i.nfs_controle) as TIPO_FRETE,
                i.quantidade
            from TBNFS_ITEM I,(select distinct OSPLIT from split(:nfs_controle,',')) k
            where i.nfs_controle = k.OSPLIT
            and i.produto_codigo = :Produto_Id
            and i.tamanho        = :Tamanho
            and i.situacao = 1
          into
            :CUSTO_FRETE_RATEADO,
            :VALOR_FRETE2,
            :TIPO_FRETE,
            :QUANTIDADE_NOTA
          do begin

            :CONT_FRETE = :CONT_FRETE + :QUANTIDADE_NOTA;

            :FRETE = :FRETE + cast((
                 iif(TIPO_FRETE = 0 and VALOR_FRETE2 >  0                               , cast((custo_frete_rateado - (VALOR_FRETE2 / :QUANTIDADE_NOTA)) as double precision) * :QUANTIDADE_NOTA,
                 iif(TIPO_FRETE = 0 and VALOR_FRETE2 <= 0 and :CUSTO_FRETE_RATEADO >  0 , cast((custo_frete_rateado) as double precision)     * :QUANTIDADE_NOTA,
                 iif(TIPO_FRETE = 0 and VALOR_FRETE2 <= 0 and :CUSTO_FRETE_RATEADO <= 0 , cast(((:PRECO_VENDA - :MARGEM) * (:PERC_FRETE  / 100)) as double precision) * :QUANTIDADE_NOTA,
                 iif(TIPO_FRETE = 3                                                     , cast(((:PRECO_VENDA - :MARGEM) * (:PERC_FRETE  / 100)) as double precision) * :QUANTIDADE_NOTA,
            0))))) as numeric(15,4));

          end

          if(:FRETE < 0)then
          begin
           :FRETE = 0;
          end else
          begin
            if(:CONT_FRETE > 0)then
            begin
                :FRETE = cast((cast(:FRETE as double precision) / cast(:CONT_FRETE as double precision)) as numeric(18,4));
            end
          end
            
          if (:Est_Min = '1') Then
          Begin
            :Quantidade = 2000;
          End

          --limpa custo produto
          delete from tmpcusto_produto;

          FOR
            select distinct
                h.ts,
                h."TO",
                (H.C  + H.coip + (H.csip/iif(:FATOR_SETUP > 1, :FATOR_SETUP , :Quantidade)) + h.coia + (H.csia/iif(:FATOR_SETUP > 1, :FATOR_SETUP , :Quantidade)) + H.CO + (H.CS / iif(:FATOR_SETUP > 1, :FATOR_SETUP , :Quantidade))) as C,
                H.CMO as CO,
                (H.CMS  / :Quantidade) as CS,
                H.CMOIP + (H.CSMOIP /:Quantidade) as CIP,
                H.CMOIA + (H.CSMOIA /:Quantidade) as CIA,
                H.PERDA
            from SPC_CALCULAR_CUSTO_V4(:ANO,:MES,:MODELO_ID,:COR_ID,:Tamanho,'',:MODELO_ID,:Tamanho, :MESES, :TIPO_CALCULO,1,0) H where NIVEL = -1
          INTO
            :TS, :TOP, :C, :CO, :CS, :CIP, :CIA, :PERDA
          Do Begin

                 :VALOR_CONTA = (:CONTAS * (:TS/:Quantidade)) + (:CONTAS * :TOP);

                 UPDATE OR INSERT INTO TBPEDIDO_ITEM_CUSTO (MARGEM, TEMPO_OPERACIONAL, TEMPO_SETUP, C_MPR, C_STP, C_MOD, C_MOI_PR, C_MOI_AB, PERCENTUAL_PERDA, CONTAS, COMISSAO, FRETE, TRIBUTOS, PERCENTUAL_IR, DATA, CLIENTE, PRODUTO_ID, TAMANHO, QUANTIDADE, DATA_UPDATE)
                   VALUES (
                        :MARGEM,
                        :TOP,
                        :TS,
                        :C,
                        :CS,
                        :CO,
                        :CIP,
                        :CIA,
                        :PERDA,
                        :VALOR_CONTA,
                        :COMISSAO,
                        :FRETE,
                        :TRIBUTOS,
                        :PERCENTUAL_IR,
                        :Data,
                        :Cliente_ID,
                        :Produto_Id,
                        :Tamanho,
                        :Quantidade,
                        current_timestamp
                    ) MATCHING (DATA, CLIENTE, PRODUTO_ID, TAMANHO);

             End
      End
End;

CREATE OR ALTER procedure spu_pedido_margem_contrib_v2 (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer,
    imodelo_id integer = 0,
    tipo_calculo integer = 0)
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable preco_venda2 numeric(15,4);
declare variable contas numeric(18,4);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
declare variable moeda varchar(3);
declare variable taxa_dolar numeric(15,4);
declare variable calculo_frete varchar(1000);
declare variable tipo_frete3 integer;
declare variable percentual_contas numeric(15,2);
declare variable old_contas numeric(18,4);
Begin

  :CONTAS   = 0;
  :GP_ID    = '';
  :MINUTOS  = 0;
  :PERFIL_UP= '';
  :FATURAMENTO_FAMILIA = 0;

  if(TIPO_CALCULO = 0)then
  begin
      :ANO = extract(year from  :DATA_1);
      :MES = extract(Month from :DATA_2);
    
      :DATA_DESPESA1 = dateadd(month, (MESES - 1) * -1, :DATA_1);
      :DATA_DESPESA2 = DATA_2;
  end else
  begin
      :ANO = FN_DATA_CUSTO(2);
      :MES = FN_DATA_CUSTO(1);
    
      :DATA_DESPESA1 = dateadd(month, (MESES - 1) * -1, FN_DATA_CUSTO2());
      :DATA_DESPESA2 = fn_end_of_month(FN_DATA_CUSTO2());
  end

  :ANO0 = extract(year from  :DATA_DESPESA1);
  :MES0 = extract(Month from :DATA_DESPESA1);

  :TAXA_DOLAR = coalesce((select first 1 d.dolar_venda from tbdolar_mensal d order by d.data descending),0);

  for
    select first 1
        PERCENTUAL_IR
    from TBCUSTO_INCENTIVO v where v.PERCENTUAL = 0
  into
    :PERCENTUAL_IR
  do begin
    --IR
  end

  for
    SELECT
        first 1
        c.GP_ID,
        c.PERFIL_UP,
        c.fator_setup
    from TBREGRA_CALCULO_CUSTO c
    where c.familia_id = :FAMILIA_ID
  into
    :GP_ID, :PERFIL_UP, :FATOR_SETUP
  do begin
    --configuracoes
  end

  for
    SELECT
        MINUTOS / :MESES
    from
        spc_minutos_disponiveis2(:FAMILIA_ID,:GP_ID,:PERFIL_UP,:MES0,:ANO0,:MES,:ANO)
  into
    :MINUTOS
  do begin
    --minutos disponiveis
  end

  for
    select (FAMILIA / TOTAL) as FATURAMENTO_FAMILIA
          from (select
            sum(iif(f.familia_id = cast(:FAMILIA_ID as integer), f.faturamento, 0)) FAMILIA,
            sum(f.faturamento) as TOTAL
        from tbfamilia_faturamento f where fn_start_of_month('01.'||f.mes||'.'||f.ano) between  :DATA_DESPESA1 and :DATA_DESPESA2)
  into
    :FATURAMENTO_FAMILIA
  do begin
    --faturamento da familia
  end

  for
    select
        sum(kk.valor) / :MESES
    from(
        select
            d.valor
        from tbdespesa_historico d
        where fn_start_of_month('01.'||d.mes||'.'||d.ano) between :DATA_DESPESA1 and :DATA_DESPESA2
        and d.conta <> ''
    ) kk
  into
    :CONTAS
  do begin
     :CONTAS = cast((:CONTAS * :FATURAMENTO_FAMILIA) / iif(:MINUTOS > 0, :MINUTOS, 1) as numeric(18,8));
  end

  OLD_CONTAS = :CONTAS;

  delete from tblog_procedure h where h.tabela = 'MARGEM PEDIDO - '||formatdate(:DATA_1);

  For
     select
        CLIENTE_CODIGO,
        DATA,
        PRODUTO_CODIGO,
        TAMANHO,
        EST_MIN,
        MODELO_CODIGO,
        COR_ID,
        MOEDA,

        avg(tipo_frete) as tipo_frete,
        SUM(Quantidade) as Quantidade,
        avg(PRECO_VENDA) as PRECO_VENDA,
        avg(PRECO_VENDA2) as PRECO_VENDA2,
        avg(margem) as margem,
        count(Cliente_Codigo) over() as N_PRODUTO,
        row_number() over() as L_PRODUTO,
        iif(SUM(QTD_NOTA) > 0, avg(coalesce(FRETE,0)) / SUM(QTD_NOTA),0) as FRETE,
        list(nfs_controle,',') as nfs_controle,
        avg(comissao) as comissao
    
    from(
        select
            CLIENTE_CODIGO,
            DATA,
            PRODUTO_CODIGO,
            TAMANHO,
            EST_MIN,
            MODELO_CODIGO,
            COR_ID,
            moeda,

            avg(tipo_frete) as tipo_frete,
            avg(quantidade_pedido) as Quantidade,
            (avg(valor) + avg(margem)) as PRECO_VENDA,
            (avg(vr_tab) + avg(margem)) as PRECO_VENDA2,
            avg(margem) as margem,
            iif(SUM(QTD_NOTA) > 0, avg(coalesce(FRETE,0)) / SUM(QTD_NOTA),0) as FRETE,
            SUM(QTD_NOTA) as QTD_NOTA,
            list(nfs_controle,',') as nfs_controle,
            avg(comissao) as comissao
    
        from(
            Select distinct
                pi.controle,
                P.Cliente_Codigo,
                P.Data,
                PI.Produto_Codigo,
                PI.Tamanho,
                PI.EST_MIN,
                PI.Quantidade,
                pi.valor,
                pi.margem,
                pi.modelo_codigo,
                pi.cor_id,
                I.Quantidade as QTD_NOTA,
                i.valor_frete_rateado as FRETE,
                i.nfs_controle,
                coalesce((select comissao from  tbrepresentante r where r.codigo = p.representante_codigo),0) as comissao,
                p.moeda,
                pi.vr_tab,
                p.frete as tipo_frete,
                pi.situacao,
                pi.quantidade - iif(pi.situacao = 3,coalesce((select s.quantidade from tbpedido_item_saldo s where s.pedido_item_controle = pi.controle and s.pedido = pi.pedido),0),0) as quantidade_pedido
            
               From TbPedido P, tbcliente c, TbPedido_Item PI
               left join TBNFS_ITEM I on i.pedido_item_pe_controle = pi.controle and i.pedido = pi.pedido
            
                Where P.Data between :Data_1 and :Data_2
                  and P.Pedido = PI.Pedido
                  and P.familia_codigo = :Familia_Id
                  and iif(:IMODELO_ID > 0, pi.modelo_codigo = :IMODELO_ID, true)
                  and c.codigo = p.cliente_codigo
                  --and c.uf = 'EX'
                  --and c.uf = 'EX'
                  --and p.data >= '01.01.2018'

      ) kk where quantidade_pedido > 0
        Group By controle, Cliente_Codigo, Data, Produto_Codigo, Tamanho, Est_Min, modelo_codigo, cor_id, moeda
  ) kk
        Group By Cliente_Codigo, Data, Produto_Codigo, Tamanho, Est_Min, modelo_codigo, cor_id, moeda


  INTO :Cliente_ID, :Data, :Produto_Id, :Tamanho, :Est_Min, :MODELO_ID, :COR_ID, :MOEDA, :TIPO_FRETE3, :Quantidade, :PRECO_VENDA, :PRECO_VENDA2, :MARGEM, :N_PRODUTO, :L_PRODUTO, :VALOR_FRETE, :nfs_controle, :COMISSAO
  Do Begin
        in autonomous transaction do
        begin

        PERCENTUAL_CONTAS = coalesce(fn_parametro('TBMODELO_LINHA.PERCENTUAL_CONTAS',(select first 1 m.linha_codigo from tbmodelo m where m.codigo = :MODELO_ID)),100);
        CONTAS = OLD_CONTAS * (PERCENTUAL_CONTAS / 100);

        if(:MOEDA = 'USS' and :nfs_controle is null)then
        begin
            :PRECO_VENDA = cast((cast(:PRECO_VENDA2 as double precision) * cast(:TAXA_DOLAR as double precision)) as numeric(18,4));
        end
    
        execute procedure SPU_LOG_PROCEDURE( 'MARGEM PEDIDO - '||formatdate(:DATA_1) , 'Tratando: '||:L_PRODUTO||'/'||:N_PRODUTO);


        UPDATE OR INSERT INTO TBPEDIDO_ITEM_CUSTO (MARGEM, VALOR, C_MPR, C_STP, C_MOD, C_MOI_PR, C_MOI_AB, PERCENTUAL_PERDA, CONTAS, COMISSAO, FRETE, TRIBUTOS, PERCENTUAL_IR, DATA, CLIENTE, PRODUTO_ID, TAMANHO)
                                   VALUES (0, :PRECO_VENDA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, :Data, :Cliente_ID, :Produto_Id, :Tamanho)
                                 MATCHING (DATA, CLIENTE, PRODUTO_ID, TAMANHO);

          :MERCADO = Coalesce((
                            Select First 1
                            Coalesce((Select First 1 CCP.Custo_Padrao_Id
                               From TbCliente_Custo_Padrao CCP
                              Where CCP.Cliente_Id = C.Codigo
                                and CCP.Familia_Id = :Familia_Id),
                            Coalesce(
                            (Select First 1 CCP.Custo_Padrao_Id
                               From TbCliente_Custo_Padrao CCP
                              Where CCP.UF = C.UF
                                and CCP.Cliente_Id = 0
                                and CCP.Familia_Id = :Familia_Id),
                            (Select First 1 CCP.Custo_Padrao_Id
                               From TbCliente_Custo_Padrao CCP
                              Where CCP.UF = 'XX'
                                and CCP.Familia_Id = :Familia_Id))) Custo_Padrao_Id
                              From TbCliente C
                            Where C.Codigo = :Cliente_ID),10);

          :TRIBUTOS             = 0;
          :FRETE                = 0;
          :PERC_FRETE           = 0;
          :CUSTO_FRETE_RATEADO  = 0;
          :VALOR_FRETE2         = 0;
          :TIPO_FRETE           = 0;

          for
            select
                sum(iif(frete = 0 and comissao = 0 , percentual,0)) as TRIBUTOS,
                sum(iif(frete = 1                  , percentual,0)) as FRETE
            from(
                select
                    FRETE,
                    COMISSAO,
                    iif(:MARGEM > 0 and y.margem = 1, iif(y.usar_fator = 1,(y.fator/y.avos) * PERCENTUAL,PERCENTUAL), iif(y.usar_fator = 1,(y.fator/y.avos) * PERCENTUAL,PERCENTUAL))  as  PERCENTUAL
                from TBCUSTO_PADRAO_ITEM y
                where y.padrao_id = :MERCADO
            )
          into
            :TRIBUTOS, :PERC_FRETE--, :COMISSAO
          do begin
             --configuracoes do mercado

             if(:MARGEM = 0)then
             begin
                :TRIBUTOS = (:TRIBUTOS /100) * :PRECO_VENDA;
                :COMISSAO = (:COMISSAO /100) * :PRECO_VENDA;
             end else
             begin
                :TRIBUTOS = (:TRIBUTOS /100) * (:PRECO_VENDA - :MARGEM);
                :COMISSAO = (:COMISSAO /100) * :PRECO_VENDA;
             end

          end

          CONT_FRETE = 0;
          :CALCULO_FRETE = '';
           for
            select
                coalesce(i.custo_frete_rateado,0) as custo_frete_rateado,
                coalesce(i.valor_frete,0) as valor_frete,
                (select first 1 s.frete from tbnfs_transportadora s where s.nfs_controle = i.nfs_controle) as TIPO_FRETE,
                i.quantidade
            from TBNFS_ITEM I,(select distinct OSPLIT from split(:nfs_controle,',')) k
            where i.nfs_controle = k.OSPLIT
            and i.produto_codigo = :Produto_Id
            and i.tamanho        = :Tamanho
            and i.situacao = 1
          into
            :CUSTO_FRETE_RATEADO,
            :VALOR_FRETE2,
            :TIPO_FRETE,
            :QUANTIDADE_NOTA
          do begin

            :CALCULO_FRETE =  :CALCULO_FRETE||', '||:CUSTO_FRETE_RATEADO||', '||:VALOR_FRETE2||', '||:TIPO_FRETE||', '||:QUANTIDADE_NOTA;

            :CONT_FRETE = :CONT_FRETE + :QUANTIDADE_NOTA;

            :FRETE = :FRETE + cast((
                 iif(TIPO_FRETE = 0 and VALOR_FRETE2 >  0                               , cast((custo_frete_rateado - (VALOR_FRETE2 / :QUANTIDADE_NOTA)) as double precision) * :QUANTIDADE_NOTA,
                 iif(TIPO_FRETE = 0 and VALOR_FRETE2 <= 0 and :CUSTO_FRETE_RATEADO >  0 , cast((custo_frete_rateado) as double precision)     * :QUANTIDADE_NOTA,
                 iif(TIPO_FRETE = 0 and VALOR_FRETE2 <= 0 and :CUSTO_FRETE_RATEADO <= 0 , cast(((:PRECO_VENDA - :MARGEM) * (:PERC_FRETE  / 100)) as double precision) * :QUANTIDADE_NOTA,
                 iif(TIPO_FRETE = 3                                                     , cast(((:PRECO_VENDA - :MARGEM) * (:PERC_FRETE  / 100)) as double precision) * :QUANTIDADE_NOTA,
            0))))) as numeric(15,4));

          end

          :CALCULO_FRETE = :CALCULO_FRETE||' FRETE:'||:FRETE||' QTD:'||:CONT_FRETE||';';

          if(:FRETE < 0)then
          begin
           :FRETE = 0;
          end else
          begin
            if(:CONT_FRETE > 0)then
            begin
                :FRETE = cast((cast(:FRETE as double precision) / cast(:CONT_FRETE as double precision)) as numeric(18,4));
            end
          end

          if(:FRETE = 0 and (TIPO_FRETE3 = 1 or :TIPO_FRETE3 = 3))then
          begin
             :FRETE = cast(((:PRECO_VENDA - :MARGEM) * (:PERC_FRETE  / 100)) as double precision);
          end
            
          if (:Est_Min = '1') Then
          Begin
            :Quantidade = 2000;
          End

          --limpa custo produto
          delete from tmpcusto_produto;

          FOR
            select distinct
                h.ts,
                h."TO",
                (H.C  + H.coip + (H.csip/iif(:FATOR_SETUP > 1, :FATOR_SETUP , :Quantidade)) + h.coia + (H.csia/iif(:FATOR_SETUP > 1, :FATOR_SETUP , :Quantidade)) + H.CO + (H.CS / iif(:FATOR_SETUP > 1, :FATOR_SETUP , :Quantidade))) as C,
                H.CMO as CO,
                (H.CMS  / :Quantidade) as CS,
                H.CMOIP + (H.CSMOIP /:Quantidade) as CIP,
                H.CMOIA + (H.CSMOIA /:Quantidade) as CIA,
                H.PERDA
            from SPC_CALCULAR_CUSTO_V4(:ANO,:MES,:MODELO_ID,:COR_ID,:Tamanho,'',:MODELO_ID,:Tamanho, :MESES, :TIPO_CALCULO,1,0) H where NIVEL = -1
          INTO
            :TS, :TOP, :C, :CO, :CS, :CIP, :CIA, :PERDA
          Do Begin

                 :VALOR_CONTA = (:CONTAS * (:TS/:Quantidade)) + (:CONTAS * :TOP);

                 UPDATE OR INSERT INTO TBPEDIDO_ITEM_CUSTO (MARGEM, TEMPO_OPERACIONAL, TEMPO_SETUP, C_MPR, C_STP, C_MOD, C_MOI_PR, C_MOI_AB, PERCENTUAL_PERDA, CONTAS, COMISSAO, FRETE, TRIBUTOS, PERCENTUAL_IR, DATA, CLIENTE, PRODUTO_ID, TAMANHO, QUANTIDADE, DATA_UPDATE, CALCULO_FRETE)
                   VALUES (
                        :MARGEM,
                        :TOP,
                        :TS,
                        :C,
                        :CS,
                        :CO,
                        :CIP,
                        :CIA,
                        :PERDA,
                        :VALOR_CONTA,
                        :COMISSAO,
                        :FRETE,
                        :TRIBUTOS,
                        :PERCENTUAL_IR,
                        :Data,
                        :Cliente_ID,
                        :Produto_Id,
                        :Tamanho,
                        :Quantidade,
                        current_timestamp,
                        :CALCULO_FRETE
                    ) MATCHING (DATA, CLIENTE, PRODUTO_ID, TAMANHO);

             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 char(1);
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_custo_minuto (
    estabelecimento_id integer,
    data date,
    familia_producao integer)
as
declare variable vfamilia_id integer;
declare variable vgp_id varchar(10);
declare variable vperfil_up char(1);
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;
        
        --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)

        UPDATE OR INSERT INTO TBCUSTO_MINUTO (ANO, MES, CUSTO_MINUTO, CCUSTO, MOI_PROPRIO, MOI_ABSORVIDO,ESTACOES,MINUTOS_DIA,MINUTOS_NOITE,MINUTOS_TOTAL)
                              VALUES (:ANO,:MES, :CUSTO_MINUTO, :vCCUSTO, :MOI_PROPRIO, :MOI_ABSORVIDO,  :vestacoes, :vtotal_minutos_dia, :vtotal_minutos_noite, :vtotal_minutos)
                            MATCHING (ANO, MES, CCUSTO);

   END
END;

CREATE OR ALTER procedure spu_custo_despesa (
    familia_id integer,
    data_1 date,
    data_2 date,
    meses integer)
returns (
    ret_contas numeric(18,8),
    total_contas numeric(18,8))
as
declare variable cliente_id integer;
declare variable data date;
declare variable produto_id integer;
declare variable tamanho integer;
declare variable est_min char(1);
declare variable quantidade numeric(15,4);
declare variable ano integer;
declare variable mes integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable c numeric(18,8);
declare variable co numeric(18,8);
declare variable cs numeric(18,8);
declare variable cip numeric(18,8);
declare variable cia numeric(18,8);
declare variable perda numeric(18,8);
declare variable tributos decimal(15,4);
declare variable frete numeric(15,4);
declare variable comissao numeric(15,4);
declare variable preco_venda numeric(15,4);
declare variable preco_venda2 numeric(15,4);
declare variable contas numeric(18,8);
declare variable gp_id varchar(10);
declare variable perfil_up varchar(10);
declare variable minutos integer;
declare variable faturamento_familia numeric(18,4);
declare variable mercado integer;
declare variable ts numeric(18,8);
declare variable top numeric(18,8);
declare variable percentual_ir numeric(18,8);
declare variable fator_setup integer;
declare variable data_despesa1 timestamp;
declare variable data_despesa2 timestamp;
declare variable new_var integer;
declare variable valor_conta numeric(18,8);
declare variable n_produto integer;
declare variable l_produto integer;
declare variable ano0 integer;
declare variable mes0 integer;
declare variable valor_frete numeric(18,4);
declare variable margem numeric(18,8);
declare variable nfs_controle varchar(1000);
declare variable custo_frete_rateado numeric(18,4);
declare variable valor_frete2 numeric(18,2);
declare variable tipo_frete integer;
declare variable quantidade_nota numeric(18,8);
declare variable perc_frete numeric(18,8);
declare variable cont_frete integer;
declare variable moeda varchar(3);
declare variable taxa_dolar numeric(15,4);
declare variable calculo_frete varchar(1000);
declare variable tipo_frete3 integer;
declare variable tipo_calculo integer;
Begin
  TIPO_CALCULO = 1;

  :CONTAS   = 0;
  :GP_ID    = '';
  :MINUTOS  = 0;
  :PERFIL_UP= '';
  :FATURAMENTO_FAMILIA = 0;

  if(TIPO_CALCULO = 0)then
  begin
      :ANO = extract(year from  :DATA_1);
      :MES = extract(Month from :DATA_2);
    
      :DATA_DESPESA1 = dateadd(month, (MESES - 1) * -1, :DATA_1);
      :DATA_DESPESA2 = DATA_2;
  end else
  begin
      :ANO = FN_DATA_CUSTO(2);
      :MES = FN_DATA_CUSTO(1);
    
      :DATA_DESPESA1 = dateadd(month, (MESES - 1) * -1, FN_DATA_CUSTO2());
      :DATA_DESPESA2 = fn_end_of_month(FN_DATA_CUSTO2());
  end

  :ANO0 = extract(year from  :DATA_DESPESA1);
  :MES0 = extract(Month from :DATA_DESPESA1);

  :TAXA_DOLAR = coalesce((select first 1 d.dolar_venda from tbdolar_mensal d order by d.data descending),0);

  for
    select first 1
        PERCENTUAL_IR
    from TBCUSTO_INCENTIVO v where v.PERCENTUAL = 0
  into
    :PERCENTUAL_IR
  do begin
    --IR
  end

  for
    SELECT
        first 1
        c.GP_ID,
        c.PERFIL_UP,
        c.fator_setup
    from TBREGRA_CALCULO_CUSTO c
    where c.familia_id = :FAMILIA_ID
  into
    :GP_ID, :PERFIL_UP, :FATOR_SETUP
  do begin
    --configuracoes
  end

  for
    SELECT
        MINUTOS / :MESES
    from
        spc_minutos_disponiveis2(:FAMILIA_ID,:GP_ID,:PERFIL_UP,:MES0,:ANO0,:MES,:ANO)
  into
    :MINUTOS
  do begin
    --minutos disponiveis
  end

  for
    select (FAMILIA / TOTAL) as FATURAMENTO_FAMILIA
          from (select
            sum(iif(f.familia_id = cast(:FAMILIA_ID as integer), f.faturamento, 0)) FAMILIA,
            sum(f.faturamento) as TOTAL
        from tbfamilia_faturamento f where fn_start_of_month('01.'||f.mes||'.'||f.ano) between  :DATA_DESPESA1 and :DATA_DESPESA2)
  into
    :FATURAMENTO_FAMILIA
  do begin
    --faturamento da familia
  end

  for
    select
        sum(kk.valor) / :MESES
    from(
        select
            d.valor
        from tbdespesa_historico d
        where fn_start_of_month('01.'||d.mes||'.'||d.ano) between :DATA_DESPESA1 and :DATA_DESPESA2
        and d.conta <> ''
    ) kk
  into
    :CONTAS
  do begin
     :TOTAL_CONTAS = CONTAS;
     :CONTAS = cast((:CONTAS * :FATURAMENTO_FAMILIA) / iif(:MINUTOS > 0, :MINUTOS, 1) as numeric(18,8));
  end

  RET_CONTAS = :CONTAS;

  UPDATE OR INSERT INTO TBCUSTO_DESPESA (MES, ANO, FAMILIA_ID, VALOR, FATOR)
                               VALUES (extract(month from :DATA_2), extract(year from :DATA_2), :FAMILIA_ID, :TOTAL_CONTAS, :RET_CONTAS)
                             MATCHING (MES, ANO, FAMILIA_ID);
  suspend;

End;

CREATE OR ALTER function fn_programacao_tempo_novo (
    modelo_id integer,
    cor_id integer,
    tam integer,
    tipo integer)
returns numeric(14,4)
as
declare variable totalsetup2 integer;
declare variable totalsetup1 integer;
declare variable totalsetup3 numeric(14,4);
declare variable resultado numeric(14,4);
declare variable totalprocesso1 numeric(14,4);
declare variable totalprocesso2 integer;
declare variable totalprocesso3 integer;
declare variable id integer;
declare variable familia_producao integer;
declare variable sequencia integer;
declare variable familia_id integer;
declare variable gp_id varchar(40);
declare variable perfil_up char(4);
declare variable up_padrao1 integer;
declare variable up_padrao2 integer;
declare variable calculo_rebobinamento char(4);
declare variable calculo_conformacao char(4);
declare variable ccusto varchar(40);
declare variable fator numeric(18,2);
declare variable status char(4);
declare variable remessas_defeito integer;
begin

  for
    SELECT
        c.ID,
        c.FAMILIA_PRODUCAO,
        c.SEQUENCIA,
        c.FAMILIA_ID,
        c.GP_ID,
        c.PERFIL_UP,
        c.UP_PADRAO1,
        c.UP_PADRAO2,
        c.CALCULO_REBOBINAMENTO,
        c.CALCULO_CONFORMACAO,
        c.CCUSTO,
        c.FATOR,
        c.STATUS,
        c.REMESSAS_DEFEITO

    from TBREGRA_CALCULO_CUSTO c, tbmodelo m
    where c.familia_producao = 3
    and m.familia_codigo = c.familia_id
    and m.codigo = :MODELO_ID
  into
    ID,
    FAMILIA_PRODUCAO,
    SEQUENCIA,
    FAMILIA_ID,
    GP_ID,
    PERFIL_UP,
    UP_PADRAO1,
    UP_PADRAO2,
    CALCULO_REBOBINAMENTO,
    CALCULO_CONFORMACAO,
    CCUSTO,
    FATOR,
    STATUS,
    REMESSAS_DEFEITO
  do
  begin

  end

  :TOTALPROCESSO1 = 0;
  :TOTALSETUP1    = 0;
  :TOTALPROCESSO2 = 0;
  :TOTALSETUP2    = 0;
  :TOTALPROCESSO3 = 0;
  :TOTALSETUP3    = 0;

  if(UP_PADRAO2 > 0)then
  begin  
      Delete from Tmp22040 Where True;
      INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:UP_PADRAO2 ,:modelo_id, :cor_id, :Tam, 1);
      SELECT TOTALPROCESSO, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO into :TOTALPROCESSO1, :TOTALSETUP1;
  end

  if(UP_PADRAO1 > 0)then
  begin
      Delete from Tmp22040 Where True;
      INSERT INTO TMP22040 (UP_ID, MODELO_ID, COR_ID, TAMANHO, QUANTIDADE) VALUES (:UP_PADRAO1 ,:modelo_id, :cor_id, :Tam, 1);
      SELECT TOTALPROCESSO, TOTALSETUP From SPC_PROGRAMACAO_TEMPO_NOVO into :TOTALPROCESSO2, :TOTALSETUP2;
  end

  SELECT TEMPO, TEMPO_SETUP From SPC_PROGRAMACAO_TEMPO_BOJO (:modelo_id, :Tam, :cor_id, 1) INTO :TOTALPROCESSO3, :TOTALSETUP3;

  if(TIPO = 1)then
  begin
    RESULTADO = TOTALPROCESSO1 + TOTALPROCESSO2 + TOTALPROCESSO3;
  end
  else
  begin
    RESULTADO = TOTALSETUP1 + TOTALSETUP2 + TOTALSETUP3;
  end

  return RESULTADO;
end;
