CREATE OR ALTER procedure spc_skus_ecommerce (
    novo integer,
    produto integer = 0)
returns (
    produto_id integer,
    cor_id integer,
    modelo_id integer,
    tamanho integer,
    tamanho_descricao varchar(10),
    sku varchar(20),
    ean varchar(50),
    localizacao_id integer)
as
begin
  for
    SELECT
    
        p.codigo as ID,
        p.cor_codigo,
        p.modelo_codigo,
        p.localizacao_codigo
    
    from tbproduto p, tbmodelo m, tbmodelo_linha l
    where iif(:NOVO = 0, true, p.salesforce = 0)
    and m.codigo = p.modelo_codigo
    and l.codigo = m.linha_codigo
    and l.habilitar_ecommerce = 1
    and iif(:PRODUTO > 0, p.codigo = :PRODUTO, true)
  into
    :PRODUTO_ID,
    :COR_ID,
    :MODELO_ID,
    :LOCALIZACAO_ID
  do begin
     for
        select TAMANHO, TAMANHO_DESCRICAO from SPC_MODELO_GRADE_TAMANHO(:MODELO_ID)
     into
        :TAMANHO,
        :TAMANHO_DESCRICAO
     do begin
        :SKU = :PRODUTO_ID||'-'||lpad(:TAMANHO,2,'0');
        :EAN = (select first 1 e.prefixo||e.codigo from TBEAN e where e.modelo_id = :MODELO_ID and e.cor_id = :COR_ID and e.tamanho = :TAMANHO);
       suspend;
     end
  end

end;

CREATE OR ALTER trigger ttbestoque_saldo_alocacao_999 for tbestoque_saldo_alocacao
active before insert or update or delete position 999
AS
declare variable produto integer;
begin

  update tbreplica_tabela set Status = '0'
  Where tabela = 'TBREPOSICAO_CONSUMO'
    and Status = '1';

  --se vende no ecommerce
  produto = coalesce((select first 1 k.produto_id from SPC_SKUS_ECOMMERCE(0,new.produto_id) k),0);
  if(produto > 0)then
  begin
      UPDATE OR INSERT INTO TBUPDATE_ECOMMERCE (TABELA, TABELA_ID, SUB_ID)
            VALUES ('TBESTOQUE_SALDO', new.produto_id, new.estabelecimento_id)
          MATCHING (TABELA, TABELA_ID, SUB_ID);
  end

end;

CREATE OR ALTER trigger ttbestoque_saldo_999 for tbestoque_saldo
active before insert or update or delete position 999
AS
declare variable produto integer;
begin

  update tbreplica_tabela set Status = '0'
  Where tabela = 'TBESTOQUE_SALDO'
    and Status = '1';

  update tbreplica_tabela set Status = '0'
  Where tabela = 'TBREPOSICAO_CONSUMO'
    and Status = '1';

  --se vende no ecommerce
  produto = coalesce((select first 1 k.produto_id from SPC_SKUS_ECOMMERCE(0,new.produto_codigo) k),0);
  if(produto > 0)then
  begin
      UPDATE OR INSERT INTO TBUPDATE_ECOMMERCE (TABELA, TABELA_ID, SUB_ID)
            VALUES ('TBESTOQUE_SALDO', new.produto_codigo, new.estabelecimento_codigo)
          MATCHING (TABELA, TABELA_ID, SUB_ID);
  end

end;


INSERT INTO TBCONTROLE_N (ID, GRUPO, PARAMETRO, VALOR_EXT, COMENTARIO, MENU)
                  VALUES (274, 'GCWEB', 'USUÁRIOS QUE SERÃO NOTIFICADOS SOBRE PEDIDOS DO ECOMMERCE', '0', 'IDS SEPARADAS POR VIRGULA', '0');
				  		

CREATE trigger ttbpedido_b10u for tbpedido
active before update position 0
AS
begin

  if(new.ecommerce = 1 and new.status_ecommerce <> old.status_ecommerce)then
  begin

      UPDATE OR INSERT INTO TBUPDATE_ECOMMERCE (TABELA, TABELA_ID, SUB_ID)
            VALUES ('TBPEDIDO', new.pedido, 0)
          MATCHING (TABELA, TABELA_ID, SUB_ID);

  end

end;

CREATE OR ALTER trigger ttbpedido_b10i for tbpedido
active before insert position 10
AS
begin
  if(new.ecommerce = 1)then
  begin
    new.representante_codigo = coalesce((SELECT FIRST 1 P.valor_ext  FROM tbcontrole_n P WHERE P.id = 272),0);
    new.familia_codigo = null;
    new.status_ecommerce = 1;
    new.status_pagamento = 1;
  end
end;

ALTER TABLE TBPEDIDO
    ADD CTE VARCHAR(300) DEFAULT '';

COMMENT ON COLUMN TBPEDIDO.CTE IS
'codigo do cte';

CREATE OR ALTER trigger ttbpedido_b10i for tbpedido
active before insert position 0
AS
begin
  if(new.ecommerce = 1)then
  begin
    new.representante_codigo = coalesce((SELECT FIRST 1 P.valor_ext  FROM tbcontrole_n P WHERE P.id = 272),0);
    new.familia_codigo = null;
    new.status_ecommerce = 2;
    new.status_pagamento = 1;
    new.codigo_rastreio = '';
    new.cte = '';

    UPDATE OR INSERT INTO TBUPDATE_ECOMMERCE (TABELA, TABELA_ID, SUB_ID)
            VALUES ('TBPEDIDO', new.pedido, 0)
          MATCHING (TABELA, TABELA_ID, SUB_ID);
  end
end;

CREATE OR ALTER trigger ttbpedido_b9u for tbpedido
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = '';

   if (OLD.Cliente_Codigo <> NEW.Cliente_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Cliente:'||OLD.Cliente_Codigo||'->'||NEW.Cliente_Codigo;
       END
   if (OLD.Cliente_Id_Amostra <> NEW.Cliente_Id_Amostra) then
       BEGIN
       HISTORICO = HISTORICO||' Cli.Amostra:'||OLD.Cliente_Id_Amostra||'->'||NEW.Cliente_Id_Amostra;
       END
   if (OLD.Data <> NEW.Data) then
       BEGIN
       HISTORICO = HISTORICO||' Dt.Emiss.'||OLD.Data||'->'||NEW.Data;
       END
   if (OLD.Data_Cliente <> NEW.Data_Cliente) then
       BEGIN
       HISTORICO = HISTORICO||' Dt.Cli.'||OLD.Data_Cliente||'->'||NEW.Data_Cliente;
       END
   if (OLD.Programado<> NEW.Programado) then
       BEGIN
       HISTORICO = HISTORICO||' Prog.'||OLD.Programado||'->'||NEW.Programado;
       END
   if (OLD.Data_Entrega <> NEW.Data_Entrega) then
       BEGIN
       HISTORICO = HISTORICO||' Prev.Fat.'||OLD.Data_Entrega||'->'||NEW.Data_Entrega;
       END
   if (OLD.Pedido_Cliente <> NEW.Pedido_Cliente) then
       BEGIN
       HISTORICO = HISTORICO||' Ped.Cli.'||OLD.Pedido_Cliente||'->'||NEW.Pedido_Cliente;
       END
   if (OLD.Transportadora_Codigo<> NEW.Transportadora_Codigo) then
       BEGIN
       HISTORICO = HISTORICO||' Transp.'||OLD.Transportadora_Codigo||'->'||NEW.Transportadora_Codigo;
       END
   if (OLD.Prioridade<> NEW.Prioridade) then
       BEGIN
       HISTORICO = HISTORICO||' Prior.'||OLD.Prioridade||'->'||NEW.Prioridade;
       END
   if (OLD.Frete<> NEW.Frete) then
       BEGIN
       HISTORICO = HISTORICO||' Frete.'||OLD.Frete||'->'||NEW.Frete;
       END
   if (OLD.Pagamento_Forma<> NEW.Pagamento_Forma) then
       BEGIN
       HISTORICO = HISTORICO||' Form.Pg.'||OLD.Pagamento_Forma||'->'||NEW.Pagamento_Forma;
       END
   if (OLD.Pagamento_Condicao<> NEW.Pagamento_Condicao) then
       BEGIN
       HISTORICO = HISTORICO||' Cond.Pg.'||OLD.Pagamento_Condicao||'->'||NEW.Pagamento_Condicao;
       END

   if (OLD.Valor_Frete <> NEW.Valor_Frete) then
       BEGIN
       HISTORICO = HISTORICO||' Vr.Frt.'||OLD.Valor_Frete||'->'||NEW.Valor_Frete;
       END
   if (OLD.Peso <> NEW.Peso) then
       BEGIN
       HISTORICO = HISTORICO||' Peso:'||OLD.Peso||'->'||NEW.Peso;
       END
   if (OLD.Tipo_Pedido <> NEW.Tipo_Pedido) then
       BEGIN
       HISTORICO = HISTORICO||' Tp.Ped.'||OLD.Tipo_Pedido||'->'||NEW.Tipo_Pedido;
       END
   if (OLD.Classificacao <> NEW.Classificacao) then
       BEGIN
       HISTORICO = HISTORICO||' Perf.'||OLD.Classificacao||'->'||NEW.Classificacao;
       END
   if (OLD.Classificacao_Financeira <> NEW.Classificacao_Financeira) then
       BEGIN
       HISTORICO = HISTORICO||' Class.Fin.'||OLD.Classificacao_Financeira||'->'||NEW.Classificacao_Financeira;
       END
   if (OLD.CCusto <> NEW.CCusto) then
       BEGIN
       HISTORICO = HISTORICO||' C.Custo:'||OLD.CCusto||'->'||NEW.CCusto;
       END
   if (OLD.Tabela_Uf <> NEW.Tabela_Uf) then
       BEGIN
       HISTORICO = HISTORICO||' Tab.Uf:'||OLD.Tabela_Uf||'->'||NEW.Tabela_Uf;
       END
   if (OLD.Codigo_Rastreio <> NEW.Codigo_Rastreio) then
       BEGIN
       HISTORICO = HISTORICO||' Cód.Rastreio:'||OLD.Codigo_Rastreio||'->'||NEW.Codigo_Rastreio;
       END
   if (OLD.Embalagem <> NEW.Embalagem) then
       BEGIN
       HISTORICO = HISTORICO||' Emb.'||OLD.Embalagem||'->'||NEW.Embalagem;
       END
   if (OLD.Tabela_Preco_Id <> NEW.Tabela_Preco_Id) then
       BEGIN
       HISTORICO = HISTORICO||' Tab.Preço:'||OLD.Tabela_Preco_Id||'->'||NEW.Tabela_Preco_Id;
       END
   if (OLD.Desconto1 <> NEW.Desconto1) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.1:'||OLD.Desconto1||'->'||NEW.Desconto1;
       END
   if (OLD.Desconto2 <> NEW.Desconto2) then
       BEGIN
       HISTORICO = HISTORICO||' Desc.2:'||OLD.Desconto2||'->'||NEW.Desconto2;
       END


   if (OLD.Observacao<> NEW.Observacao) then
       BEGIN
       HISTORICO = HISTORICO||' Observ.'||OLD.Observacao||'->'||NEW.Observacao;
       END

   if (OLD.Volumes<> NEW.Volumes) then
       BEGIN
       HISTORICO = HISTORICO||' Vol.'||OLD.Volumes||'->'||NEW.Volumes;
       END

   if (OLD.STATUS <> NEW.STATUS) then
       BEGIN
       if (NEW.STATUS = '0') then
           HISTORICO = HISTORICO||' Status Inativado';
       if (NEW.STATUS = '1') then
           HISTORICO = HISTORICO||' Status Ativado';
       END
 
   if (OLD.SITUACAO <> NEW.SITUACAO) then
       BEGIN
       if (NEW.SITUACAO = '0') then
           HISTORICO = HISTORICO||' Pedido Desconfirmado';
           new.status_ecommerce = 2;
       if (NEW.SITUACAO = '1') then
           HISTORICO = HISTORICO||' Pedido Confirmado';
           new.status_ecommerce = 3;
       END

   if (OLD.FORMA_ANALISE <> NEW.FORMA_ANALISE) then
       BEGIN
       HISTORICO = HISTORICO||' F.Analise:'||OLD.FORMA_ANALISE ||'->'||NEW.FORMA_ANALISE;
       END
    
   if (OLD.CHAVE_LIBERACAO <> NEW.CHAVE_LIBERACAO) then
       BEGIN
       HISTORICO = HISTORICO||' Chave:'||OLD.CHAVE_LIBERACAO||'->'||NEW.CHAVE_LIBERACAO;
       END
 
   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO', OLD.PEDIDO,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End
end;

CREATE trigger ttbpedido_item_b10u for tbpedido_item
active before update position 10
AS
declare variable ecommerce integer;
declare variable pendentes integer;
begin

  if(new.situacao <> old.situacao)then
  begin
      ecommerce = coalesce((select first 1 p.ecommerce from tbpedido p where p.pedido = new.pedido),0);

      if(ecommerce = 1)then
      begin
         pendentes = coalesce((select count(i.controle) as pendentes from tbpedido_item i where i.pedido = new.pedido and i.situacao = 1),1);
    
         if(pendentes = 0)then
         begin
            update tbpedido c set c.status_ecommerce = 4 where c.pedido = new.pedido;
         end
      end
  end
  
end;

COMMENT ON TRIGGER TTBPEDIDO_ITEM_B10U IS 'se for ecommerce verifica se todos os itens foram faturados para mudar sattus do pedido no ecommerce';

CREATE OR ALTER trigger ttbnfs_embarque_b0u_01 for tbnfs_embarque
active before update position 0
AS
declare variable pedido integer;
begin
    if ( (old.DATA_SAIDA <> new.DATA_SAIDA) or (old.DATA_SAIDA is null)  ) then
    begin
        update TBNFS n set n.SALESFORCE = '0' where n.CONTROLE = old.NFS_CONTROLE;
    end

    --atualiza status embarque ecomerce
    if ( (old.DATA_SAIDA <> new.DATA_SAIDA) or (old.DATA_SAIDA is not null)  ) then
    begin
        for
            select distinct
                p.pedido
            from tbnfs_item i, tbpedido_item pi, tbpedido p
            where i.nfs_controle = new.nfs_controle
            and pi.controle = i.pedido_item_pe_controle
            and p.pedido = i.pedido
            and p.ecommerce = 1
       into
          :pedido
       do begin
          update tbpedido c set c.status_ecommerce = 7 where c.pedido = :pedido;
       end
    end

    --atualiza status entrega ecomerce
    if ( (old.data_entrega <> new.data_entrega) or (old.data_entrega is not null)  ) then
    begin
        for
            select distinct
                p.pedido
            from tbnfs_item i, tbpedido_item pi, tbpedido p
            where i.nfs_controle = new.nfs_controle
            and pi.controle = i.pedido_item_pe_controle
            and p.pedido = i.pedido
            and p.ecommerce = 1
       into
          :pedido
       do begin
          update tbpedido c set c.status_ecommerce = 8 where c.pedido = :pedido;
       end
    end
end;

CREATE trigger ttbpedido_item_b03i for tbpedido_item
active before insert position 0
AS
declare variable ecommerce integer;
declare variable cliente integer;
declare variable uf varchar(2);
declare variable estabelecimento integer;
begin
   estabelecimento = coalesce((select first 1 p.estabelecimento_codigo from tbpedido p where p.pedido = new.pedido and p.ecommerce = 1),0);

   if(estabelecimento > 0)then
   begin
      cliente = coalesce((select first 1 p.cliente_codigo from tbpedido p where p.pedido = new.pedido and p.ecommerce = 1),0);
      uf      = coalesce((select first 1 e.uf from tbestabelecimento e where e.codigo = :estabelecimento),'');
      cliente = coalesce((select e.codigo from tbempresa e where e.codigo = :cliente and coalesce(e.ie,'') = '' and e.uf = :uf),0);

      if(cliente > 0)then
      begin
        new.valor =  (new.valor * ((100 - 2.91) / 100.00));
        new.observacao = coalesce(new.observacao,'')||', valor do item com abatimento de 2,91%';
      end
   end
end;

COMMENT ON TRIGGER TTBPEDIDO_ITEM_B03I IS 'calcula valor unitario do item caso seja de ecomerce e cliente do ceara e sem IE';

CREATE OR ALTER trigger ttbpedido_b10u for tbpedido
active before update position 10
AS
begin

  if(   (new.ecommerce = 1 and new.status_ecommerce <> old.status_ecommerce)
     or (new.codigo_rastreio <> old.codigo_rastreio)
     or (new.cte <> old.cte)  )then
  begin

      UPDATE OR INSERT INTO TBUPDATE_ECOMMERCE (TABELA, TABELA_ID, SUB_ID)
            VALUES ('TBPEDIDO', new.pedido, 0)
          MATCHING (TABELA, TABELA_ID, SUB_ID);

  end

end;

