CREATE GENERATOR GTBCUSTO_PRODUTO;

ALTER TABLE TMPCUSTO_PRODUTO
    ADD FAMILIA_ID INTEGER,
    ADD MODELO_ID INTEGER,
    ADD COR_ID INTEGER;



CREATE TABLE TBCUSTO_PRODUTO (
    ID                 INTEGER NOT NULL,
    PRODUTO_ID         INTEGER,
    ANO                INTEGER,
    MES                INTEGER,
    NIVEL              INTEGER,
    PRODUTO_DESCRICAO  VARCHAR(400),
    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,
    CUSTO_MINUTO       NUMERIC(18,8),
    MOI_PROPRIO        NUMERIC(18,8),
    MOI_ABSORVIDO      NUMERIC(18,8),
    COIP               NUMERIC(18,8),
    COIA               NUMERIC(18,8),
    CSIP               NUMERIC(18,8),
    CSIA               NUMERIC(18,8),
    CONSUMO            NUMERIC(18,8),
    FLAG_TAMANHO       INTEGER,
    GENEALOGIA         VARCHAR(200),
    DATA               DATE,
    CUSTO              NUMERIC(18,8),
    DOLAR              NUMERIC(18,8),
    MARGEM             NUMERIC(15,4),
    OPERACIONAL        NUMERIC(18,8),
    INDIRETO           NUMERIC(18,8)
);

CREATE INDEX ITBCUSTO_PRODUTO_02 ON TBCUSTO_PRODUTO (PRODUTO_CONSUMO);
CREATE INDEX ITBCUSTO_PRODUTO_03 ON TBCUSTO_PRODUTO (ORIGEM);
CREATE INDEX ITBCUSTO_PRODUTO_04 ON TBCUSTO_PRODUTO (GENEALOGIA);
CREATE INDEX ITBCUSTO_PRODUTO_05 ON TBCUSTO_PRODUTO (NIVEL);
CREATE INDEX ITBCUSTO_PRODUTO_06 ON TBCUSTO_PRODUTO (ORIGEM, ANO, MES, NIVEL, FLAG_TAMANHO, GENEALOGIA);
CREATE INDEX ITBCUSTO_PRODUTO_07 ON TBCUSTO_PRODUTO (FLAG_TAMANHO);
CREATE INDEX ITBCUSTO_PRODUTO_08 ON TBCUSTO_PRODUTO (ANO, MES, NIVEL, ORIGEM);
CREATE INDEX TBCUSTO_PRODUTO_01 ON TBCUSTO_PRODUTO (ANO, MES);

CREATE OR ALTER TRIGGER TTBCUSTO_PRODUTO_B01I FOR TBCUSTO_PRODUTO
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbcusto_produto,1);
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

  :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_CALCULAR_ABSORVIDO (
    IANO integer,
    IMES integer,
    PRODUTO_ID integer,
    ITAMANHO integer,
    FATOR_SETUP 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),
    MARGEM numeric(15,4),
    OPERACIONAL numeric(18,8),
    INDIRETO numeric(18,8))
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 GENEALOGIA varchar(200);
declare variable CALC decimal(18,8);
declare variable OLD_TAMANHO integer;
declare variable VMARGEM numeric(15,4);
declare variable IMODELO_ID integer;
declare variable ICOR_ID integer;
declare variable VMODELO_ID integer;
declare variable VFAMILIA_ID integer;
declare variable VCOR_ID integer;
declare variable OFAMILIA_ID integer;
begin

    delete from tmpcusto_produto;

    select
        ww.modelo_codigo,
        ww.cor_codigo
    from tbproduto ww where ww.codigo = :PRODUTO_ID
    into
        :IMODELO_ID,
        :icor_id;

    --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, MARGEM, FAMILIA_ID, MODELO_ID, COR_ID
        from spc_estrutura_absorvido(:IANO,:IMES,:ITAMANHO,-1,:PRODUTO_ID,'') 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)),
            h.c = cast((cast(h.custo_medio as double precision) * cast((T / fator_conversao) as double precision)) 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,
                K.familia_id
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS,
            :VFAMILIA_ID
        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,
                    :OFAMILIA_ID,
                    :vMODELO_ID,
                    :vCOR_ID
                do begin

                    update tmpcusto_produto h

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

                        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 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

    OPERACIONAL = 0;
    INDIRETO    = 0;
    --retorna o resultado do tratamento
    for
        select
            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,
            ORIGEM,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO AND K.nivel = 0
    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
    do begin

        OPERACIONAL = OPERACIONAL + ( 0
               + (CMO * CONSUMO)
               + (CMS / :FATOR_SETUP)
               + (CO  * CONSUMO)
               + (CS  / 2000)
        );

        INDIRETO = INDIRETO + (0
               + (CMOIP  * CONSUMO)
               + (CMOIA  * CONSUMO)
               + (CSMOIP / :FATOR_SETUP)
               + (CSMOIA / :FATOR_SETUP)
               + (COIP   * CONSUMO)
               + (COIA   * CONSUMO)
               + (CSIP  / :FATOR_SETUP)
               + (CSIA  / :FATOR_SETUP)
        );
    end

    --retorna o resultado do tratamento
    for
        select first 1
            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,
            ORIGEM,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM
        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
    do begin
        suspend;
    end

end;

CREATE OR ALTER procedure SPC_CALCULAR_CUSTO (
    IPRODUTO_ID integer,
    ITAMANHO integer,
    IMODELO_ID integer,
    IFAMILIA_ID integer,
    IANO integer,
    IMES integer)
returns (
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(100),
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(100),
    COR_ID integer,
    COR_DESCRICAO varchar(100),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(20),
    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),
    CUSTO_MINUTO numeric(18,8),
    MOI_PROPRIO numeric(18,8),
    MOI_ABSORVIDO numeric(18,8),
    DATA date,
    CUSTO numeric(18,8),
    DOLAR numeric(18,8),
    MARGEM numeric(18,4),
    OPERACIONAL numeric(18,8),
    INDIRETO numeric(18,8))
as
declare variable NIVEL integer;
declare variable ANO integer;
declare variable MES integer;
declare variable FLAG integer;
declare variable FLAG_TAMANHO integer;
declare variable H_ORIGEM varchar(200);
declare variable LINHAS integer;
declare variable C_LINHAS integer;
declare variable FATOR_SETUP integer;
begin
    C_LINHAS = 0;

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

    for
        select
            s.PRODUTO_ID,
            s.PRODUTO_DESCRICAO,
            s.MODELO_ID,
            s.MODELO_DESCRICAO,
            s.COR_ID,
            s.COR_DESCRICAO,
            s.TAMANHO,
            s.TAMANHO_DESCRICAO,
            count(PRODUTO_ID) over() as LINHAS
        from tbproduto p, SPC_SKUS(:ifamilia_id,:imodelo_id) s
        where p.codigo = s.PRODUTO_ID
        and iif(:IPRODUTO_ID > 0, p.codigo  = :IPRODUTO_ID, true)
        and iif(:ITAMANHO    > 0, s.tamanho = :ITAMANHO, true)
    into
        PRODUTO_ID,
        PRODUTO_DESCRICAO,
        MODELO_ID,
        MODELO_DESCRICAO,
        COR_ID,
        COR_DESCRICAO,
        TAMANHO,
        TAMANHO_DESCRICAO,
        LINHAS
    do begin

        C_LINHAS = C_LINHAS + 1;
        for
            select first 1
                ANO,
                MES,
                NIVEL,
                PRODUTO_DESCRICAO,
                PRODUTO_CONSUMO,
                TAMANHO_CONSUMO,
                ORIGEM,
                TS,
                "TO",
                CMS,
                CMO,
                CMOIP,
                CMOIA,
                CSMOIP,
                CSMOIA,
                PERDA,
                CONSUMO,
                C,
                T,
                CS,
                CO,
                COIP,
                COIA,
                CSIP,
                CSIA,
                CUSTO_MEDIO,
                FATOR_CONVERSAO,
                TAMANHO,
                FLAG,
                CUSTO_MINUTO,
                MOI_PROPRIO,
                MOI_ABSORVIDO,
                FLAG_TAMANHO,
                H_ORIGEM,
                DATA,
                CUSTO,
                DOLAR,
                MARGEM,
                OPERACIONAL,
                INDIRETO
            --from SPC_CALCULAR_CUSTO_V6(:Iano,:imes,:modelo_id,:cor_id,:tamanho,'',:modelo_id, :tamanho,0)
            from SPC_CALCULAR_ABSORVIDO(:Iano,:imes,:PRODUTO_ID,:tamanho, :FATOR_SETUP)

            where NIVEL = -1
        into
            ANO,
            MES,
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            TAMANHO_CONSUMO,
            ORIGEM,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            CONSUMO,
            C,
            T,
            CS,
            CO,
            COIP,
            COIA,
            CSIP,
            CSIA,
            CUSTO_MEDIO,
            FATOR_CONVERSAO,
            TAMANHO,
            FLAG,
            CUSTO_MINUTO,
            MOI_PROPRIO,
            MOI_ABSORVIDO,
            FLAG_TAMANHO,
            H_ORIGEM,
            DATA,
            CUSTO,
            DOLAR,
            MARGEM,
            OPERACIONAL,
            INDIRETO
        do begin
            in autonomous transaction
            do begin
                UPDATE OR INSERT INTO TBCUSTO_PRODUTO (PRODUTO_ID, ANO, MES, NIVEL, PRODUTO_DESCRICAO, PRODUTO_CONSUMO, TAMANHO_CONSUMO, ORIGEM, TS, "TO", CMS, CMO, CMOIP, CMOIA, CSMOIP, CSMOIA, PERDA, C, T, CS, CO, CUSTO_MEDIO, FATOR_CONVERSAO, TAMANHO, CUSTO_MINUTO, MOI_PROPRIO, MOI_ABSORVIDO, COIP, COIA, CSIP, CSIA, CONSUMO, FLAG_TAMANHO, DATA, CUSTO, DOLAR, MARGEM,OPERACIONAL,INDIRETO)
                                   VALUES (:PRODUTO_ID, :ANO, :MES, :NIVEL, :PRODUTO_DESCRICAO, :PRODUTO_CONSUMO, :TAMANHO_CONSUMO, :ORIGEM, :TS, :"TO", :CMS, :CMO, :CMOIP, :CMOIA, :CSMOIP, :CSMOIA, :PERDA, :C, :T, :CS, :CO, :CUSTO_MEDIO, :FATOR_CONVERSAO, :TAMANHO, :CUSTO_MINUTO, :MOI_PROPRIO, :MOI_ABSORVIDO, :COIP, :COIA, :CSIP, :CSIA, :CONSUMO, :FLAG_TAMANHO, :DATA, :CUSTO, :DOLAR, :MARGEM, :OPERACIONAL, :INDIRETO)
                                 MATCHING (PRODUTO_ID, ANO, MES, TAMANHO);
            end
        end

        suspend;
    end

end;

