CREATE OR ALTER trigger ttbcusto_margem_sku_b01d for tbcusto_margem_sku
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;

CREATE OR ALTER trigger ttbcusto_margem_sku_b01u for tbcusto_margem_sku
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;

CREATE OR ALTER trigger ttbcusto_margem_sku_b02i for tbcusto_margem_sku
active before insert position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

end;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

end;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

end;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

end;

CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

end;

ALTER TABLE TBCUSTO_MARGEM_SKU ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBCUSTO_MARGEM_SKU set OLD_PERFIL = PERFIL;
ALTER TABLE TBCUSTO_MARGEM_SKU DROP PERFIL;
ALTER TABLE TBCUSTO_MARGEM_SKU ADD PERFIL VARCHAR(10) DEFAULT '';
update TBCUSTO_MARGEM_SKU set PERFIL = OLD_PERFIL;
ALTER TABLE TBCUSTO_MARGEM_SKU DROP OLD_PERFIL;

CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

  :INIVEL = :INIVEL + 1;

  for
  select * from(
        select distinct
            p.descricao,
            f.produto_consumo_id,
            :IPRODUTO_ID as PRODUTO_ID,
            f.tamanho_consumo_id,
    
            f.fator_conversao,
            f.custo_medio,
            0 as dolar,
    
            iif(:ITAMANHO = 00,T00, iif(:ITAMANHO = 10,T10,
            iif(:ITAMANHO = 01,T01, iif(:ITAMANHO = 11,T11,
            iif(:ITAMANHO = 02,T02, iif(:ITAMANHO = 12,T12,
            iif(:ITAMANHO = 03,T03, iif(:ITAMANHO = 13,T13,
            iif(:ITAMANHO = 04,T04, iif(:ITAMANHO = 14,T14,
            iif(:ITAMANHO = 05,T05, iif(:ITAMANHO = 15,T15,
            iif(:ITAMANHO = 06,T06, iif(:ITAMANHO = 16,T16,
            iif(:ITAMANHO = 07,T07, iif(:ITAMANHO = 17,T17,
            iif(:ITAMANHO = 08,T08, iif(:ITAMANHO = 18,T18,
            iif(:ITAMANHO = 09,T09, iif(:ITAMANHO = 19,T19,
            iif(:ITAMANHO = 20,T20,0))))))))))))))))))))) as T,
    
            iif(:ITAMANHO = 00,C00, iif(:ITAMANHO = 10,C10,
            iif(:ITAMANHO = 01,C01, iif(:ITAMANHO = 11,C11,
            iif(:ITAMANHO = 02,C02, iif(:ITAMANHO = 12,C12,
            iif(:ITAMANHO = 03,C03, iif(:ITAMANHO = 13,C13,
            iif(:ITAMANHO = 04,C04, iif(:ITAMANHO = 14,C14,
            iif(:ITAMANHO = 05,C05, iif(:ITAMANHO = 15,C15,
            iif(:ITAMANHO = 06,C06, iif(:ITAMANHO = 16,C16,
            iif(:ITAMANHO = 07,C07, iif(:ITAMANHO = 17,C17,
            iif(:ITAMANHO = 08,C08, iif(:ITAMANHO = 18,C18,
            iif(:ITAMANHO = 09,C09, iif(:ITAMANHO = 19,C19,
            iif(:ITAMANHO = 20,C20,0))))))))))))))))))))) as C,
    
            iif(:ITAMANHO = 00,CS00, iif(:ITAMANHO = 10,CS10,
            iif(:ITAMANHO = 01,CS01, iif(:ITAMANHO = 11,CS11,
            iif(:ITAMANHO = 02,CS02, iif(:ITAMANHO = 12,CS12,
            iif(:ITAMANHO = 03,CS03, iif(:ITAMANHO = 13,CS13,
            iif(:ITAMANHO = 04,CS04, iif(:ITAMANHO = 14,CS14,
            iif(:ITAMANHO = 05,CS05, iif(:ITAMANHO = 15,CS15,
            iif(:ITAMANHO = 06,CS06, iif(:ITAMANHO = 16,CS16,
            iif(:ITAMANHO = 07,CS07, iif(:ITAMANHO = 17,CS17,
            iif(:ITAMANHO = 08,CS08, iif(:ITAMANHO = 18,CS18,
            iif(:ITAMANHO = 09,CS09, iif(:ITAMANHO = 19,CS19,
            iif(:ITAMANHO = 20,CS20,0))))))))))))))))))))) as CS,
    
            iif(:ITAMANHO = 00,CO00, iif(:ITAMANHO = 10,CO10,
            iif(:ITAMANHO = 01,CO01, iif(:ITAMANHO = 11,CO11,
            iif(:ITAMANHO = 02,CO02, iif(:ITAMANHO = 12,CO12,
            iif(:ITAMANHO = 03,CO03, iif(:ITAMANHO = 13,CO13,
            iif(:ITAMANHO = 04,CO04, iif(:ITAMANHO = 14,CO14,
            iif(:ITAMANHO = 05,CO05, iif(:ITAMANHO = 15,CO15,
            iif(:ITAMANHO = 06,CO06, iif(:ITAMANHO = 16,CO16,
            iif(:ITAMANHO = 07,CO07, iif(:ITAMANHO = 17,CO17,
            iif(:ITAMANHO = 08,CO08, iif(:ITAMANHO = 18,CO18,
            iif(:ITAMANHO = 09,CO09, iif(:ITAMANHO = 19,CO19,
            iif(:ITAMANHO = 20,CO20,0))))))))))))))))))))) as CO,

            0 TS,
            0 "TO",
            0 CMS,
            0 CMO,
            0 CMOIP,
            0 CMOIA,
            0 CSMOIP,
            0 CSMOIA,
            0 PERDA,
            P.familia_codigo,
            P.modelo_codigo,
            P.cor_codigo
    
        from tbproduto p, tbficha_tecnica f
        
        where f.produto_id = :IPRODUTO_ID
        and p.codigo = f.produto_consumo_id
        and f.ano = :IANO
        and f.mes = :IMES
    ) where T > 0

  into
    :PRODUTO_DESCRICAO,
    :PRODUTO_CONSUMO,
    :ORIGEM,
    :TAMANHO_CONSUMO,
    :FATOR_CONVERSAO,
    :CUSTO_MEDIO,
    :DOLAR,
    :T,
    :C,
    :CS,
    :CO,
    :TS,
    :"TO",
    :CMS,
    :CMO,
    :CMOIP,
    :CMOIA,
    :CSMOIP,
    :CSMOIA,
    :PERDA,
    :FAMILIA_ID,
    :MODELO_ID,
    :COR_ID
  do begin
    :TAMANHO = :ITAMANHO;
    :NIVEL   = :INIVEL;

    select F.familia_codigo FROM tbproduto F WHERE F.codigo = :IPRODUTO_ID
    INTO :FAMILIA_ID;


    MARGEM = coalesce((select first 1
                (sk.margem + 100.0000) / 100.00 as MARGEM
            from tbcusto_margem_sku sk,vwsku ss
                where sk.familia_id = :FAMILIA_ID
                and ss.modelo_id = :MODELO_ID
                and ss.cor_id = :COR_ID
                and ss.perfil = sk.perfil
                and ss.tamanho = :TAMANHO_CONSUMO),1.0000);

    :TROCA = 0;
    
    if(:IGENEALOGIA = '')then
    begin
        :GENEALOGIA = :ORIGEM;
    end else
    begin
        :GENEALOGIA = :IGENEALOGIA||'#'||:ORIGEM;
    end
    suspend;

    if(:PRODUTO_CONSUMO <> :IPRODUTO_ID)then
    begin

        for
          select
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            ORIGEM,
            TAMANHO_CONSUMO,
            FATOR_CONVERSAO,
            CUSTO_MEDIO,
            T,
            C,
            CS,
            CO,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            TAMANHO,
            GENEALOGIA,
            DOLAR,
            MARGEM,
            FAMILIA_ID,
            MODELO_ID,
            COR_ID
          from spc_estrutura_absorvido(:IANO,:IMES,:TAMANHO_CONSUMO,:INIVEL,:PRODUTO_CONSUMO, :GENEALOGIA)
        into
            :NIVEL,
            :PRODUTO_DESCRICAO,
            :PRODUTO_CONSUMO,
            :ORIGEM,
            :TAMANHO_CONSUMO,
            :FATOR_CONVERSAO,
            :CUSTO_MEDIO,
            :T,
            :C,
            :CS,
            :CO,
            :TS,
            :"TO",
            :CMS,
            :CMO,
            :CMOIP,
            :CMOIA,
            :CSMOIP,
            :CSMOIA,
            :PERDA,
            :TAMANHO,
            :GENEALOGIA,
            :DOLAR,
            :MARGEM,
            :FAMILIA_ID,
            :MODELO_ID,
            :COR_ID
        do begin
           suspend;
        end
    end

  end
end;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

--in autonomous transaction do
--if(true)then
--begin
    delete from tmpcusto_produto;

    iproduto_troca      = '';
    modelo_original     = imodelo_id;
    tamanho_original    = itamanho;
    meses               = 1;
    validar_ficha       = 0;
    tipo_custo          = 1;
    taxa_dolar          = 0;

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        o.familia_codigo,
        o.modelo_codigo,
        o.cor_codigo
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,FAMILIA_ID,MODELO_ID,COR_ID
        from spc_estrutura_custo_lite(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin

            if(:FILHOS > 0)then
            begin

                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO;

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :FAMILIA_ID,
                    :MODELO_ID,
                    :COR_ID
                do begin

                       --/*
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);
                      --*/


                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;

                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
    
                h.custo  = h.custo_medio,
                h.custo_medio = cast(cast(h.custo_medio    AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))
                */

                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;

        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
        --and k.nivel = -1
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :FAMILIA_ID,
        :MODELO_ID,
        :COR_ID
    do begin

        for
            select first 1
                c.fator_setup
            from tbregra_calculo_custo c, tbproduto p
            where c.familia_id = p.familia_codigo
            and p.codigo = :PRODUTO_CONSUMO
        into
            :fator_setup
        do begin

            :CMS     = :CMS     / :quantidade;
            :CSMOIP  = :CSMOIP  / :quantidade;
            :CSMOIA  = :CSMOIA  / :quantidade;

            :CS      = :CS      / :fator_setup;
            :CSIP    = :CSIP    / :fator_setup;
            :CSIA    = :CSIA    / :fator_setup;

        end

        suspend;
  end
  --end

  --suspend;
end;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);

    :OLD_ANO = :IANO;
    :OLD_MES = :IMES;

        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,0,0,0
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0
        from SPC_ESTRUTURA_CUSTO_V2(:OLD_ANO,:OLD_MES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_id,
                    :modelo_id,
                    :cor_id
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id
    do begin
        suspend;
    end
end;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);


        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        O.familia_codigo,
        O.modelo_codigo,
        O.cor_codigo
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0
        from SPC_ESTRUTURA_CUSTO(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_ID,
                    :modelo_ID,
                    :cor_ID
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id
    do begin
        suspend;
    end
end;


CREATE OR ALTER trigger ttbcusto_margem_sku_b02i for tbcusto_margem_sku
active before insert position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    HISTORICO = 'Perfil:'||new.perfil||', Margem: '||new.margem||' inserido';

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCUSTO_MARGEM_SKU',new.familia_id, HISTORICO);
    END

end;

CREATE OR ALTER trigger ttbcusto_margem_sku_b01u for tbcusto_margem_sku
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( old.margem <> new.margem) THEN
    BEGIN
        HISTORICO = 'Perfil:'||new.perfil||', Margem: '||old.margem||' -> '||new.margem;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCUSTO_MARGEM_SKU',new.familia_id, HISTORICO);
    END
end;


CREATE OR ALTER trigger ttbcusto_margem_sku_b01d for tbcusto_margem_sku
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    HISTORICO = 'Perfil:'||old.perfil||': Excluido.';

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBCUSTO_MARGEM_SKU',old.familia_id, HISTORICO);
    END
end;
