Skip to main content

index

Home​

Descrição​

Aplicação que escuta o serviço de RabbitMQ para alimentar o Elastisearch com dados dos fretes atualizados.

Finalidade​

Alimentar Elastisearch com dados dos fretes para gerar BI aos setores de negócio e também gerarmos gráficos melhores no Dash.

Objetivos​

  • Ser um serviço desacoplado que consulta dados de forma estruturada.
  • Serviço autônomo que não depende de outros para consultar e alimentar a base do Elasticsearch.

Fluxo​

  • API Interna ao receber uma atualização do frete, disparará o ID do frete (id do banco MariaDB) ao RabbitMQ, em que esta API ELK estará escutando e consultará os dados do ID recebido para enviar ao Elasticsearch;

alt text

Stakeholders (envolvidos)​

  • Em primeiro lugar os setores de negócio da Frete Rápido (Implantação, Operação e Suporte);
  • Demais clientes ao utilizar o Dashbboard para consumir dados de BI;

Serviços Correlacionados (outras aplicações)​

  • RabbitMQ;
  • API Interna;
  • Banco de dados (MariaDB);
  • Elastick Stack;
  • Redis (Para armazenar cache na sincronização dos fretes por período)

Rotas externas​

  • /freight?{onlyShow} : informar o(s) ID(s) do frete(s) (id relacional do MariaDB) para realizar a consulta;

    • Query Params:
      • onlyShow: true ou false para apenas consultar os dados e retornar via API. Se true, não enviará para o Elasticsearch.
  • /freight/{id_ficticio}: consultar os dados do frete armazenado no Elasticsearch

  • /freight/sync-period: sincronizar fretes de um determinado período, do MariaDB para o Elasticsearch

    • Body:
      • start_date: Data inicial da Sincronização
      • end_date: Data final da Sincronização
      • max_freights_per_query: Quantidade máxima de fretes buscados nas queries do SQL. (Limit)
      • ignore_updates: Valor booleano, caso seja true, a sincronização não levará em consideração os fretes que já foram sincronizados no Elasticsearch.

Rodar esse projeto:​

make run

Exemplo para rodar esse projeto em dois containers:​

docker-compose up --scale api-elk=2

Pre-processed fields:​

Campos pré processados

  • value_volumes - soma de freight.volumes.total_price

  • value_nfe_items - soma de freight.invoices.items_value

  • quantity_nfe_volumes - soma de freight.invoices.quantity_volumes

  • volume_quantity - freight.volumes.length

  • real_weight - float de freight.real_weight

  • cubed_weight - float de freight.cubed_weight

  • cubed_weight_ctes - soma de freight.bill_of_landing.cubed_weight

  • gross_weight_ctes - soma de freight.bill_of_landing.gross_weight

  • amount_value_ctes - soma de freight.bill_of_landing.amount

  • amount_value_nfes - soma de freight.invoices.amount

  • receiver_region — verifica o campo freight.receiver.city.state.federated_unit

  • shipper_region — verifica o campo freight.shipper_address.city.state.federated_unit

  • dispatcher_region — verifica o campo freight.dispatcher.city.state.federated_unit

  • delay_reason - de/para motivos de atraso

  • insuccess_reason - de/para motivos de insucesso (entregues em atraso ou não entregues)

  • collection_date — verifica o status de coleta (freight.ocurrences.code == 15) e pega como retorno o campo freight.occurrences.ocurrence_date (caso não esteja preenchido, assume o valor de freight.occurrences.created_at)

  • expected_delivery_days — verifica o campo freight.hiring_date e freight.expected_delivery_date e calcula os dias úteis - não incluindo sábados, domingos e feriados

  • lead_time_days — verifica o campo freight.hiring_date e freight.delivery_date e calcula os dias úteis - não incluindo sábados, domingos e feriados

  • transit_time_days — verifica o campo collection_date e freight.expected_delivery_date e calcula os dias úteis - não incluindo sábados, domingos e feriados

  • total_revenue - verifica se o campo amount_value_nfes não é zero, caso seja, envia o campo value_volumes

  • max_real_weight - verifica o maior valor entre os campos de peso (kg): freight.real_weight e freight.cubed_weight

  • contingency_amount_ctes - verifica se o campo amount_value_ctes não é zero, caso seja, envia o campo freight.hired_offer.original_price. Essa solução foi elaborada para casos onde a transportadora não enviou o CTe do respectivo frete - para obtermos o cálculo da margem de frete.

  • delivery_in_progress_status - de/para de pedidos em progresso

  • business_to_consumer_freight - verifica se o destinatário do frete é pessoa física, baseado na quantidade de dígitos do campo freight.receiver.cnpj_cpf

  • has_occurrence_with_delay - Retorna true se data prevista de entrega (expected_delivery_date) for maior que a data atual e verificando se alguma das ocorrências tem uma diferença maior que 2 dias entre suas datas