14-16 Mar 2026
Logica do Sistema

Rotas

Secao 2

Entidade e Propriedades

Arquivo: cargo_fleet.Domain/Rotas/Rota.cs

PropriedadeTipoDescricao
TenantIdGuid?Multitenancy
TipoTipoRotaEnumSpot ou Contrato
OperacaoTipoOperacaoEnumTipo de operacao
CargaTipoCargaEnumTipo de carga
VeiculoTipoVeiculoEnumTipo de veiculo
OrigemCidadesEnum?Enum de cidade de origem
DestinoCidadesEnum?Enum de cidade de destino
QuantidadeCarrosintVeiculos disponiveis para carga normal (decrementado a cada aceite)
PeriodoInicialDateTimeInicio da janela de validade
PeriodoFinalDateTimeFim da janela de validade
Precodecimal?Preco padrao
PontoTNFCidadesEnum?Cidade de troca de NF
PrecoPerna1decimal?Preco perna 1 (TNF)
PrecoPerna2decimal?Preco perna 2 (TNF)
StatusStatusRotaEnumAtivado ou Desativado
AceitaCargaAdicionalbool?Habilita aceite de carga adicional
CargaAdicionalPeriodoInicioDateTime?Inicio do periodo para carga adicional
CargaAdicionalPeriodoFinalDateTime?Fim do periodo para carga adicional
CargaAdicionalQuantidadeVeiculosint?Veiculos disponiveis para carga adicional
AceitaTnfbool?Aceita operacao TNF
OrigemCidadeIdint?FK para tabela Cidades
DestinoCidadeIdint?FK para tabela Cidades
AbrangenciaOrigemTipoAbrangenciaGeograficaEnum?Suporte futuro a regioes
AbrangenciaDestinoTipoAbrangenciaGeograficaEnum?Suporte futuro a regioes

Verificacao de Rotas Expirando (VerificarRotasWorker)

Arquivo: cargo_fleet.HttpApi.Host/BackgroundJobs/VerificarRotasWorker.cs

  • Timer.Period = 1 dia (TimeSpan.FromDays(1).TotalMilliseconds).
  • Para cada tenant: busca rotas com PeriodoFinal entre hoje e amanha.
  • Para cada rota expirada: cria notificacao de alerta e faz dispatch via Firebase.
  • Fluxo por rota: 1 query de DeviceToken + 1 chamada Firebase por rota, sem rate limiting.

Contadores de Veiculos

Os contadores QuantidadeCarros e CargaAdicionalQuantidadeVeiculos sao gerenciados da seguinte forma:

Decremento: Ocorre em OfertasAceiteResultApplier.AplicarEfeitosAceite apos aceite bem-sucedido na API Galileu.

Restauracao: NAO existe logica de restauracao. Se uma oferta aceita for cancelada ou recusada pela Galileu (RECUSADO_APOS_ACEITE, CANCELADO), o contador permanece decrementado.

Risco de race condition: O decremento e feito em memoria (rota.QuantidadeCarros--) antes de persistir. Dois ciclos concorrentes podem ler o mesmo valor e ambos decrementar para o mesmo resultado, resultando em over-accept.


Incoerencias Identificadas

IDDescricao
P-08QuantidadeCarros e CargaAdicionalQuantidadeVeiculos nao restaurados em cancelamento
(escalabilidade)Decremento nao atomico — race condition com over-accept