CREATE TABLE TBCUSTO_MARGEM_SKU (
    ID INTEGER NOT NULL,
    FAMILIA_ID INTEGER,
    PERFIL VARCHAR(2),
    MARGEM NUMERIC(15,2));

ALTER TABLE TBCUSTO_MARGEM_SKU
ADD CONSTRAINT PK_TBCUSTO_MARGEM_SKU
PRIMARY KEY (ID);

COMMENT ON COLUMN TBCUSTO_MARGEM_SKU.FAMILIA_ID IS
'familia do custo';

COMMENT ON COLUMN TBCUSTO_MARGEM_SKU.PERFIL IS
'perfil do sku';

COMMENT ON COLUMN TBCUSTO_MARGEM_SKU.MARGEM IS
'margem operacional';

CREATE SEQUENCE GTBCUSTO_MARGEM_SKU;

create trigger ttbcusto_margem_sku_b01i for tbcusto_margem_sku
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbcusto_margem_sku,1);
end;

COMMENT ON TABLE TBCUSTO_MARGEM_SKU IS 'tabela de margem de produtos no custo, ex. bojo dentro do bojo colante deve deichar uma margem';

ALTER TABLE TBCUSTO_MARGEM_SKU
    ADD STATUS INTEGER DEFAULT 1;

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 = 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 trigger ttbcusto_margem_sku_b01d for tbcusto_margem_sku
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

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

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

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

    HISTORICO = '';
    HISTORICO = 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;

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; 

ALTER TABLE TMPCUSTO_PRODUTO
    ADD MARGEM NUMERIC(15,2);

CREATE INDEX ITBCUSTO_MARGEM_SKU_01
ON TBCUSTO_MARGEM_SKU (FAMILIA_ID);

CREATE TABLE TBDIFAL_PERCENTUAL (
    ID INTEGER NOT NULL,
    ANO INTEGER,
    PERCENTUAL NUMERIC(15,2));

ALTER TABLE TBDIFAL_PERCENTUAL
ADD CONSTRAINT PK_TBDIFAL_PERCENTUAL
PRIMARY KEY (ID);

CREATE SEQUENCE GTBDIFAL_PERCENTUAL;

create trigger ttbdifal_percentual_b01i for tbdifal_percentual
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbdifal_percentual,1);
end;

COMMENT ON TABLE TBDIFAL_PERCENTUAL IS 'tabela de % por ano do difal';

ALTER TABLE TBDIFAL_PERCENTUAL DROP ANO;


ALTER TABLE TBDIFAL_PERCENTUAL
    ADD ANO_INICIO INTEGER,
    ADD ANO_FIM INTEGER;

ALTER TABLE TBCUSTO_PADRAO
    ADD ESTABELECIMENTO INTEGER DEFAULT 1;

ALTER TABLE TBDRE_GERENCIAL_AJUSTE
    ADD TIPO_CONTA INTEGER DEFAULT 1;

COMMENT ON COLUMN TBDRE_GERENCIAL_AJUSTE.TIPO_CONTA IS
'1 - conta, 2 - avulso';

CREATE OR ALTER function fn_dre_lancamentos (
    id integer,
    conta varchar(20),
    ano integer,
    mes integer,
    tipo integer,
    natureza_servico varchar(10),
    usar_regra_comercial integer = 0,
    usar_regra_servicos integer = 0,
    sql blob sub_type 0 segment size 80 = '0')
returns numeric(15,4)
as
declare variable valor numeric(15,4);
declare variable v1 numeric(15,4);
declare variable v2 numeric(15,4);
declare variable v3 numeric(15,4);
declare variable extra numeric(15,4);
begin
   V1 = 0;
   V2 = 0;
   V3 = 0;

   if(USAR_REGRA_COMERCIAL = 0 and (TIPO = 1 or TIPO = 3))then
   begin
       V1 = coalesce((
                select sum(iif(m.natureza = 'D', m.valor * -1, m.valor))
                from tbmovcontabil m
                where m.ano = :ANO
                and m.mes   = :MES
                and m.conta = :CONTA
                and m.tipolanc <> 'E'
            ),0);
   end

   if(USAR_REGRA_SERVICOS = 0 and (TIPO = 2 or TIPO = 3))then
   begin
       V2 = coalesce((
                select sum(b.valor * iif(:NATUREZA_SERVICO = 'D', -1, 1))
                from tbccusto_cota a, tbccusto_cota_outros b
                where a.id = b.ccusto_cota_id
                and b.statusexclusao = '0'
                and a.statusexclusao = '0'
                and a.ano = :ANO
                and a.mes = :MES
                and b.contacontabil_dre = :CONTA
            ),0);
   end

   if(USAR_REGRA_COMERCIAL = 1 and (TIPO = 1 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'    ,:MES   );
       :SQL = replace(:SQL,':ANO'    ,:ANO   );
       :SQL = replace(:SQL,':CONTA'  ,:CONTA );

       :V1  = FN_EXECUTE_CALC('coalesce(('||:SQL||'))') * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   if(USAR_REGRA_SERVICOS = 1 and (TIPO = 2 or TIPO = 3))then
   begin
       :SQL = replace(:SQL,':MES'    ,:MES   );
       :SQL = replace(:SQL,':ANO'    ,:ANO   );
       :SQL = replace(:SQL,':CONTA'  ,:CONTA );

       :V2  = FN_EXECUTE_CALC('coalesce(('||:SQL||'),0)') * iif(:NATUREZA_SERVICO = 'D', -1, 1);
   end

   EXTRA = 0;

   if(TIPO = 1 or TIPO = 3)then
   begin
        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.comercial  = 1
                and m.tipo_conta = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.comercial  = 1
                and m.tipo_conta = 2
            ),0);
   end

   if(TIPO = 2 or TIPO = 3)then
   begin
        EXTRA = EXTRA + coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :CONTA
                and m.servicos   = 1
                and m.tipo_conta = 1
            ),0);

        EXTRA = EXTRA +  coalesce((
                select sum(iif(m.tipo = 'D', m.valor * -1, m.valor))
                from tbdre_gerencial_ajuste m
                where m.ano      = :ANO
                and m.mes        = :MES
                and m.conta      = :ID
                and m.servicos   = 1
                and m.tipo_conta = 2
            ),0);
   end

   VALOR = V1 + V2 + V3 + EXTRA;

   return VALOR;
end;


ALTER TABLE TBCUSTO_SIMULACAO
    ADD DIFAL BLOB SUB_TYPE 0 SEGMENT SIZE 80;

COMMENT ON COLUMN TBCUSTO_SIMULACAO.DIFAL IS
'json';


