Skip to content

Motor de recomendação

O coração do módulo. Decide o que transferir, de onde e quanto.

Algoritmo

  1. Gatilho de necessidade — por (loja, produto, cor, tamanho): dias até ruptura ≈ estoque_destino / venda_média_diária (janela = período das regras). Candidato se em ruptura (estoque 0) ou risco dentro do horizonte.
  2. Seleção de origem
    • CD-first (se priorizar CD): se o CD tem o item, ele é a origem.
    • Fallback loja→loja (só se o CD esgotou): escolhe a loja por score ponderado.
  3. Score ponderado (0–100)score = w_dist · proximidade + w_giro · baixo_giro + w_estoque · folga
    • proximidade — distância haversine (lat/lng das lojas); mais perto, melhor.
    • baixo_giro — origem com venda baixa do item é boa doadora.
    • folga — origem mantém pelo menos qtd mínima após ceder.
    • pesos w_* = peso_distancia / peso_giro / peso_estoque (devem somar 100).
    • CD recebe bônus quando priorizar CD está ligado.
  4. Bloqueios — exclui loja bloqueada, lojas/marcas bloqueadas, produto em campanha (se bloqueio_campanha), origem == destino, e destino nunca é o CD.
  5. Quantidade — cobre ~7 dias de venda do destino, respeitando qtd mínima na origem e qtd máxima por transferência.
  6. Prioridadedias até ruptura 0–2 → Alta · 3–4 → Média · 5+ → Baixa.
  7. Justificativa — texto explicando origem, distância, unidades e motivo.

Onde está no código

app/services/engine.py (back). Saída materializada como Recomendacao com snapshot de estoque/venda/distância/score no momento da geração.