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;

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.
- Query Params:
-
/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çãoend_date: Data final da Sincronizaçãomax_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.
- Body:
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 campofreight.occurrences.ocurrence_date(caso não esteja preenchido, assume o valor defreight.occurrences.created_at) -
expected_delivery_days — verifica o campo
freight.hiring_dateefreight.expected_delivery_datee calcula os dias úteis - não incluindo sábados, domingos e feriados -
lead_time_days — verifica o campo
freight.hiring_dateefreight.delivery_datee calcula os dias úteis - não incluindo sábados, domingos e feriados -
transit_time_days — verifica o campo
collection_dateefreight.expected_delivery_datee calcula os dias úteis - não incluindo sábados, domingos e feriados -
total_revenue - verifica se o campo
amount_value_nfesnão é zero, caso seja, envia o campovalue_volumes -
max_real_weight - verifica o maior valor entre os campos de peso (kg):
freight.real_weightefreight.cubed_weight -
contingency_amount_ctes - verifica se o campo
amount_value_ctesnão é zero, caso seja, envia o campofreight.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