Integração do sistema de pedidos offline com o Eligo

Índice

Sincronização dos dados do dispositivo com a matriz

PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR

Descrição

Esta interface permite executar a sincronização do dispositivo offline com o servidor da matriz além da atualização do próprio aplicativo.
Ela funciona da seguinte forma:

  1. O vendedor acessa este serviço informando a sua URL no seu browser. Este está disponível apenas quando se encontra online.
  2. O sistema apresenta uma tela pedindo usuário e senha e informando um resumo do que existe para ser enviado. Caso o vendedor já tenha usado este serviço anteriormente, o sistema já traz o nome do usuário preenchido.
  3. O vendedor informa seu usuário e senha e submete a ação clicando em "Sincronizar".
  4. O dispositivo envia os novos cadastros de clientes, mensagens e pedidos pendentes para a matriz.
  5. O servidor da matriz recebe e processa estes dados e retorna um OK ou uma mensagem de erro para o dispositivo.
  6. Caso o dispositivo receba um Erro da matriz, apresenta a mensagem de erro e encerra o processo.
  7. Caso o dispositivo receba um OK da matriz, troca o status dos pedidos Pendentes para Enviados e envia uma requisição para receber os dados atualizados.
  8. A matriz envia os dados atualizados
  9. Ao receber TODOS os dados atualizados, o dispositivo armazena-os, fundindo com pedidos em manutenção ou pendentes.

Erros

ErroDescriçãoO que fazer
481Problema ao receber os dados do servidorverificar mensagens enviadas pro tablet
482Problema ao enviar os dados ao servidorverificar mensagens enviadas pro tablet
483Problema de conexão com internetverificar se há sinal de internet e se o sinal está forte

Campos:

Usuário (vendedor) logado no dispositivo (tablet) que está fazendo a integração.
Senha (hash) do usuário (vendedor) que está fazendo a integração.
Mensagens enviadas de/para o servidor.
CSV com o cadastro dos clientes
CSV com os pedidos
CSV com os itens de pedido.
CSV com dados do vendedor

Operações

Topo

Redirecionar

Decide qual interface será aberta, caso o usuário esteja logado e offline/online, será redirecionado para tela de Clientes, caso contrario será redirecionado para tela de login
Comportamento:Topo

Sincronizar

Tela sem operações geradas. Totalmente customizada.
Comportamento:Topo

Offline > Server

Serviço que transfere os dados do dispositivo offline (tablet) para o servidor.
Comportamento:Topo

Server > Offline

Serviço de transferencia dos dados do servidor para o dispositivo offline.
Comportamento:

Dúvidas frequentes

  • Como configurar para exibição de todos os clientes no tablet?
  • Configurações

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.GERAR_NOVOS_IDS

    Gerars novos IDs para os pedidos recebidos

    Caso marcado (valor = "S"), os pedidos serão inseridos na base de dados com novos IDs.
    Esta preferência existe como solução de contorno para os problemas de PK duplicada.
    Caso não configurado, assume não gerar novos IDs

    Tipo: FLAG

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.RESUMO_VENDAS

    Script engine onde o usuário pode acrescentar informações sobre as vendas do vendedor na tela de clientes.

    As seguintes variáveis são disponibilizadas:
    • dataInicial: Primeiro dia do mês corrente
    • dataFinal: Ultimo dia do mes corrente
    • id: ID do cliente

    Caso não configurado, o seguinte script é assumido:
    set faturado as coalesce(sum(id.valor_total_item), 0) from itens_pedidos ip
    join itens_doc_entradas_saidas id on id.item_pedido_id = ip.id
    join doc_entradas_saidas doc on doc.id = id.documento_id
    where doc.data_emissao between '${dataInicial}' and '${dataFinal}
    and id.vendedor_id = ${id}
    and saldo_inventario > 0;
    
    set aFaturar as coalesce(sum(p.valor_total), 0) from pedidos p
    where p.data_emissao between '${dataInicial}' and '${dataFinal}'
    and p.vendedor_id = ${id}
    and p.situacao = 'P';
    
    item faturado decimal_value; label='FATURADO';
    
    item aFaturar decimal_value; label='A FATURAR';
    
    display ${faturado} as faturado, ${aFaturar} as aFaturar;
    

    Tipo: TEXT_LONG

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SOMENTE_CIDADES_CLIENTES

    Define se as cidades serão buscadas a partir dos clientes dos vendedores

    Valor padrão: S

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_CLIENTE

    Define o sql contendo as informações dos clientes que vão para o tablet, quando não informada utiliza o valor padrão para o método.
    Exemplo SQL:
    SELECT p.id as id
    , p.pessoa as cliente
    , case when clie.bloqueado = 'S' then 'B' else 'N' end as situacao
    , '' as chave_liberacao
    , p.nome_completo as razao_social
    , case when substr(tp.tipo_pessoa, 1, 1) = 'F' then p.apelido else p.nome_fantasia end as nome_fantasia
    , (SELECT dp.documento FROM documentos_pessoas dp JOIN tipos_documentos_pessoas tdp ON dp.tipo_documento_id = tdp.id WHERE dp.pessoa_id = p.id AND tdp.tipo_documento = 'CNPJ') AS cnpj
    , (SELECT dp.documento FROM documentos_pessoas dp JOIN tipos_documentos_pessoas tdp ON dp.tipo_documento_id = tdp.id WHERE dp.pessoa_id = p.id AND tdp.tipo_documento = 'CPF') AS cpf
    , (SELECT dp.documento FROM documentos_pessoas dp JOIN tipos_documentos_pessoas tdp ON dp.tipo_documento_id = tdp.id WHERE dp.pessoa_id = p.id AND tdp.tipo_documento = 'RG') AS rg
    , (SELECT dp.documento FROM documentos_pessoas dp JOIN tipos_documentos_pessoas tdp ON dp.tipo_documento_id = tdp.id WHERE dp.pessoa_id = p.id AND tdp.tipo_documento = 'IE') AS inscricao_estadual
    , ende.endereco as endereco
    , ende.codigo_postal as cep
    , ende.bairro as bairro
    , ende.cidade_id as cidade_id
    , ende.numero as numero
    , ende.complemento as complemento
    , ende.observacoes as ponto_referencia
    , fone1.endereco as fone_1
    , fone2.endereco as fone_2
    , fone3.endereco as fone_3 
    , clie.pessoa_contato as contato 
    , clie.observacao as observacoes 
    , clie.limite_credito
    , clie.credito_tomado
    , (SELECT ep.endereco FROM enderecos ep WHERE ep.pessoa_id = p.id AND ep.tipo_endereco_id = tp.forma_contato_3_id and ep.sequencia = 1) AS email_comercial 
    , (SELECT ep.endereco FROM enderecos ep JOIN tipos_enderecos te on te.id = ep.tipo_endereco_id WHERE ep.pessoa_id = p.id AND te.tipo_endereco = 'EMAIL_NFE' and ep.sequencia = 1) AS email_nfe
    , substr(tp.tipo_pessoa,1,1) as tipo_pessoa 
    , p.id as vendedor_id 
    , p.data_nascimento
    , clie.percentual_desconto as desconto
    FROM pessoas p 
    JOIN tipos_pessoas tp ON tp.id = p.tipo_pessoa_id 
    JOIN clientes clie ON clie.id = p.id 
    JOIN enderecos ende ON ende.pessoa_id = p.id AND tp.forma_contato_5_id = ende.tipo_endereco_id AND tp.sequencia_5 = ende.sequencia 
    JOIN cidades cida ON ende.cidade_id = cida.id 
    JOIN regioes uf ON uf.id = cida.regiao_id 
    LEFT JOIN enderecos fone1 ON fone1.pessoa_id = p.id AND tp.forma_contato_1_id = fone1.tipo_endereco_id AND tp.sequencia_1 = fone1.sequencia 
    LEFT JOIN enderecos fone2 ON fone2.pessoa_id = p.id AND tp.forma_contato_2_id = fone2.tipo_endereco_id AND tp.sequencia_2 = fone2.sequencia
    LEFT JOIN enderecos fone3 ON fone3.pessoa_id = p.id AND tp.forma_contato_3_id = fone3.tipo_endereco_id AND tp.sequencia_3 = fone3.sequencia 
    WHERE (clie.representante_id = ? or clie.vendedor_id = ?) 
    and p.situacao <> 'I' 
    order by p.nome_completo
    

    Ver também:

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_MENSAGEM

    Define o sql contendo as informações dos mensagens que vão para o tablet, quando não informado utiliza o padrão do sistema.
    Exemplo de SQL:
    select m.id, p.nome_completo as pessoa, m.resposta_mensagem_id, m.titulo, m.mensagem, m.data_inicio as data_criacao, 'S' as situacao, m.emitente_id as emitente from mensagens m left join pessoas p on (m.emitente_id = p.id) where (m.destinatario_id = ? or m.destinatario_id is null) and (m.data_termino >= now() or m.data_termino is null) and (m.data_inicio <= now() or m.data_inicio is null) order by data_inicio desc

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_PEDIDO

    Define o sql contendo as informações dos pedidos que vão para o tablet,quando não informada utiliza o valor padrão para o método.
    Exemplo de SQL:
    select p.id as id, p.cliente_id as cliente_id, p.situacao as situacao, 0 as caixa, p.data_pedido_pda as data_pedido, p.data_requerida as data_entrega, p.data_emissao as data_conclusao, p.data_entrega as data_faturamento, p.data_cancelamento as data_cancelamento, p.motivo_cancelamento as motivo_cancelamento, p.prazo_pagamento_id as forma_pagamento_id, p.tipo_pedido_id as tipo_pedido_id, p.pedido as numero_pedido, (select max(des.numero) from itens_doc_entradas_saidas ides join doc_entradas_saidas des on ides.documento_id = des.id where ides.pedido_id = p.id) as nota_fiscal, (select situacao_documento from doc_entradas_saidas where id = (select max(des.id) from itens_doc_entradas_saidas ides join doc_entradas_saidas des on ides.documento_id = des.id where ides.pedido_id = p.id)) as situacao_nota_fiscal, p.observacoes as observacoes, p.valor_total as total, p.vendedor_id as vendedor_id, '' as autorizacao from pedidos p where p.vendedor_id = ? and p.data_emissao > now() - interval '+15 day' and p.situacao != 'M' order by p.data_emissao asc

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_PEDIDOS_ITEM

    Define o sql contendo as informações dos itens de pedidos que vão para o tablet,quando não informada utiliza o valor padrão para o método.
    Exemplo de SQL:
    select i.id as id
    , i.pedido_id
    , i.preco_lista as preco_lista
    , i.preco_lista as preco_padrao
    , i.produto_id, i.quantidade
    , i.preco 
    , i.preco_lista as preco_promocional
    from itens_pedidos i 
    join pedidos p on p.id = i.pedido_id
    where p.vendedor_id = ?
    and p.data_emissao > now() - interval '+15 day'
    order by i.id
    

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_PLANOS_PAGAMENTO

    Define o SQL contendo as informações dos planos de pagamento que serão disponibilizados no app tablet.
    Quando não informada utiliza o valor padrão:
    SELECT id as id
    , plano_pagamento as condicoes_pagamento 
    , percentual_juros as indice_preco 
    , ativo
    , valor_minimo
    , pp.todos_clientes
    FROM PLANOS_PAGAMENTOS pp 
    WHERE valido = 'S'
    AND ativo = 'S'
    

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_PLANOS_PAGAMENTO_CLIENTE

    Define o sql contendo as informações dos planos de pagamentos relacionados com os clientes que vão para o tablet. Quando não informada utiliza o valor padrão para o método:
    select pgc.id
    , pgc.cliente_id
    , pgc.plano_pagamento_id as condicao_pagamento_id 
    from planos_pagamentos_clientes pgc 
    join planos_pagamentos pg on pg.id = pgc.plano_pagamento_id 
    join clientes clie on clie.id = pgc.cliente_id
    left join conceitos_clientes con on con.id = clie.conceito_id
    where (clie.representante_id = ? or clie.vendedor_id = ?)
    and pg.ativo = 'S'
    and pg.valido = 'S'
    and clie.bloqueado <> 'S'
    and coalesce(con.bloqueia_venda,'N') <> 'S'
    

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_PRODUTO

    Define o SQL contendo as informações dos produtos apresentados no app de venda tablet.

    Macros permitidas:
    • ${estabelecimentoUsuarioId}: define o ID do estabelecimento padrão do usuário.
    • ${usuarioId}: ID do usuário.

    Exemplo de SQL:
    SELECT prod.id as id
    , prod.em_falta
    , prod.produto AS produto
    , prod.descricao as descricao
    , ic.preco_sugerido::numeric(12,2) AS preco
    , case when ic.valor_promocional::numeric(12,2) is not null
                and ic.data_termino_promocional > current_date
           then ic.valor_promocional::numeric(12,2)
           else ic.preco_minimo_sugerido::numeric(12,2) end AS preco_minimo
    , case when ic.valor_promocional is not null
                and ic.data_termino_promocional > current_date
           then ic.valor_promocional::numeric(12,2)
           else null end as preco_promocional
    , ic.comissao_item
    , ic.notas as observacoes
    , ic.preco_maximo_sugerido::numeric(12,2) AS preco_maximo
    , case when prod.quantidade_unidade_acondicionamento is null then 1 else prod.quantidade_unidade_acondicionamento end as embalagem
    , um.id AS unidade_medida_id
    , 'S' as disponivel
    , COALESCE(((select sum(ep.estoque_atual) as sum from estoques_produtos ep join tipos_estoques tep on tep.id = ep.tipo_estoque_id where ep.produto_id = prod.id and ep.estabelecimento_id = ${estabelecimentoUsuarioId} and tep.tipo_estoque = 'ESTOQUE')), 0) as estoque
    , (select sum(quantidade) from v_reservas_produtos rp join tipos_estoques te on te.id = rp.tipo_estoque_id where rp.produto_id = prod.id and rp.estabelecimento_id = ${estabelecimentoUsuarioId} and te.tipo_estoque = 'ESTOQUE') as estoque_reservado
    , (select quantidade_minima_venda
       from estoques_produtos ep
       join tipos_estoques te on te.id = ep.tipo_estoque_id
       where ep.estabelecimento_id = ${estabelecimentoUsuarioId}
       and ep.produto_id = prod.id
       and te.tipo_estoque = 'ESTOQUE'
       limit 1) as quantidade_minima
    , (select case when ep.somente_multiplos = 'S' then coalesce(ep.quantidade_minima_venda,1)
                   else null end
       from estoques_produtos ep
       join tipos_estoques te on te.id = ep.tipo_estoque_id
       where ep.estabelecimento_id = ${estabelecimentoUsuarioId}
       and ep.produto_id = prod.id
       and te.tipo_estoque = 'ESTOQUE'
       limit 1) as quantidade_multipla
     FROM itens_colecoes ic 
     JOIN colecoes col ON col.id = ic.colecao_id 
     JOIN produtos prod ON prod.id = ic.produto_id 
     JOIN unidades_medidas um ON um.id = prod.unidade_medida_id 
     LEFT JOIN unidades_medidas ud ON ud.id = prod.unidade_acondicionamento_id 
     WHERE prod.situacao <> 'C' 
     AND prod.enviar_palm = 'S' 
     AND col.enviar_lista_precos_palm = 'S' 
     order by prod.descricao
    

    O comando pode ser modificado para customizar as informações de forma a permitir, p.ex., apresentar o código de barra na descrição dos produtos no app. Para isto, basta acrescentar a expressão a seguir no comando SQL:
    , prod.descricao
      || coalesce('<small>'
                  || (select codigo_barras
                       from CODIGOS_BARRAS c
                       where c.produto_id = prod.id
                       and c.tipo_codigo_barras like 'EAN'
                       limit 1)
                  || '</small>', ' ') as descricao
    

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_TIPOS_PEDIDO

    Define o sql contendo as informações dos tipos de pedidos que vão para o tablet,quando não informada utiliza o valor padrão para o método.
    Exemplo de SQL:
    select id, tipo_pedido, plano_pagamento from tipos_pedidos where categoria = 'V' and permite_integracao = 'S' order by tipo_pedido

    Tipo: SOURCE_CODE

    PEDI_OFFLINE_ELIGO.UTL_PEDI_OFFLINE_INTEGRATOR.SQL_TITULO

    Define o sql contendo as informações dos títulos que vão para o tablet,quando não informada utiliza o valor padrão para o método.
    Exemplo de SQL:
    select t.id as id, tt.tipo_titulo as tipo, t.destinatario_id as cliente_id, t.numero_titulo, t.data_conclusao as data_emissao, t.data_vencimento, t.valor from titulos t inner join tipos_titulos tt on t.tipo_titulo_id = tt.id where t.situacao not in ('L', 'C', 'B', 'M', 'P', 'N') and t.destinatario_id in (SELECT id FROM clientes clie where (clie.representante_id = ? or clie.vendedor_id = ?)) order by t.numero_titulo

    Tipo: SOURCE_CODE

    Regras

    Popular dados

    Popular os dados vindo do localStorage nos hidden
    Eventos que disparam esta regra:
    • Depois de apresentar formulário "Sincronizar"

    Popular usuário

    Preencher usuário atual e caso exista, posicionar o foco na senha.
    Eventos que disparam esta regra:
    • Depois de apresentar formulário "Sincronizar"

    Processa envio

    Monta um JSON com os dados que devem ser enviados para o tablet.

    Observações:
    • Nâo enviar produtos sem preço
    Eventos que disparam esta regra:
    • Depois de apresentar formulário "Server > Offline"

    Processa recebimento

    Processa os dados recebidos do tablet, inserindo os respectivos pedidos, seus ítens, as mensagens e novos clientes.
    Eventos que disparam esta regra:
    • Depois de apresentar formulário "Offline > Server"

    Redirecionar tela

    Se está online e tem token, navega para a tela de UtlPediOfflineIntegrator senão navega para a CadOfflineCliente.
    Eventos que disparam esta regra:
    • Antes de apresentar uma tela formulário "Redirecionar"

    Sincronizar

    Dispara o processo de sincronização no tablet.
    Primeiro envia os dados pendentes e depois busca as atualizações do servidor.

    Regras especiais no processo de integração:
    • Se CNPJ ou CPF de cliente novo já existir, não cadastra o documento e inclui nas observações da pessoa
    • Se data requerida menor que a data de emissão, assumir a data requerida como sendo a data de hoje
    • Se não conseguir montar o registro de endereço por alguma razão qualquer, montar os dados na observação da pessoa
    • Se o produto estiver cancelado, o item não deve ser incluído e uma mensagem deve ser apresentada para o vendedor
    • Se o item tem qtd zero, não inseri o item
    Eventos que disparam esta regra:
    • Ao clicar no botão "Sincronizar" do formulário "Sincronizar"

    Verificar conexão

    Caso a conexão com a internet não esteja abilitado retirar botão de sincronizar e apresentar uma mensagem
    Eventos que disparam esta regra:
    • Antes de apresentar uma tela formulário "Sincronizar"