diff --git a/app/controllers/consolidacao_entregas_controller.rb b/app/controllers/consolidacao_entregas_controller.rb index f3c46b9..1991c69 100644 --- a/app/controllers/consolidacao_entregas_controller.rb +++ b/app/controllers/consolidacao_entregas_controller.rb @@ -11,9 +11,10 @@ class ConsolidacaoEntregasController < ApplicationController authorize @consolidacao, :show? @motorista = params[:motorista] - # Entregas pagas do período no banco existente (read-only). + # Entregas atendidas do período no banco existente (read-only): sucesso + + # insucesso, pois o motorista foi ao local e a entrega precisa constar. # Período pela DATA REAL (checkout), não pela planejada. - @entregas = Entrega.pagas + @entregas = Entrega.atendidas .da_conta_gade .no_periodo_checkout(@consolidacao.data_inicio, @consolidacao.data_fim) .do_motorista(@motorista) @@ -250,11 +251,12 @@ class ConsolidacaoEntregasController < ApplicationController nome.present? && @consolidacao.consolidacao_motoristas.exists?(motorista_nome: nome) end - # tracking_ids pagos/elegíveis para o motorista no período (respeita veículos) + # tracking_ids atendidos/elegíveis para o motorista no período (respeita veículos). + # Atendidas = sucesso + insucesso com checkout (o motorista foi ao local). def tracking_ids_elegiveis(motorista) return [] unless motorista.present? - rel = Entrega.pagas.da_conta_gade + rel = Entrega.atendidas.da_conta_gade .no_periodo_checkout(@consolidacao.data_inicio, @consolidacao.data_fim) .do_motorista(motorista) rel = rel.da_veiculo(@consolidacao.vehicle_ids) if @consolidacao.vehicle_ids.present? diff --git a/app/models/consolidacao.rb b/app/models/consolidacao.rb index d2705b3..30cc246 100644 --- a/app/models/consolidacao.rb +++ b/app/models/consolidacao.rb @@ -139,11 +139,12 @@ class Consolidacao < ApplicationRecord end end - # Entregas pagas elegíveis para um motorista no período, respeitando o filtro - # de veículos da consolidação (quando houver). Fonte única usada pelo wizard, - # pela revisão e pelo gate de finalização. + # Entregas elegíveis para um motorista no período (atendidas: sucesso + + # insucesso, pois o motorista foi ao local), respeitando o filtro de veículos + # da consolidação (quando houver). Fonte única usada pelo wizard, pela revisão + # e pelo gate de finalização. def entregas_elegiveis_count(motorista) - Entrega.contar_pagas( + Entrega.contar_atendidas( inicio: data_inicio, fim: data_fim, motorista: motorista, diff --git a/app/models/entrega.rb b/app/models/entrega.rb index 5c6f000..fe76fa2 100644 --- a/app/models/entrega.rb +++ b/app/models/entrega.rb @@ -17,11 +17,20 @@ class Entrega < ApplicationRecord # AJUSTE aqui se o valor real for diferente (ex.: 'cancelled', 'not_delivered'). STATUS_FALHA = %w[failed].freeze + # Status em que o motorista FOI até o local: sucesso ('completed') ou + # insucesso ('failed'). Base da elegibilidade na consolidação — o motorista + # se deslocou, então a entrega precisa constar para ser classificada, mesmo + # que não tenha sido entregue com sucesso. + STATUS_ATENDIDO = (%w[completed] + STATUS_FALHA).freeze + # ── Scopes ────────────────────────────────────────────────── scope :concluidas, -> { where(status: 'completed') } scope :com_checkout, -> { where.not(checkout: nil) } # Pagamento = entrega concluída com checkout registrado scope :pagas, -> { concluidas.com_checkout } + # Atendidas = motorista foi ao local (sucesso OU insucesso) com checkout. + # É o conjunto elegível da consolidação (mais amplo que .pagas). + scope :atendidas, -> { where(status: STATUS_ATENDIDO).com_checkout } # Falhadas = entregas que não tiveram sucesso (status de falha) scope :falhadas, -> { where(status: STATUS_FALHA) } # Pendentes = nem concluídas nem falhadas (ainda em aberto). Exclui as falhadas @@ -121,10 +130,11 @@ class Entrega < ApplicationRecord base.distinct.order(:vehicle).pluck(:vehicle).compact.reject(&:empty?) end - # Contagem de entregas pagas para cálculo estimado. + # Contagem de entregas ATENDIDAS (motorista foi ao local: sucesso + insucesso) + # elegíveis para a consolidação. # Período pela DATA REAL da entrega (checkout) — ver no_periodo_checkout. - def self.contar_pagas(inicio:, fim:, motorista: nil, vehicle: nil, operacoes: nil) - base = pagas.da_conta_gade.no_periodo_checkout(inicio, fim) + def self.contar_atendidas(inicio:, fim:, motorista: nil, vehicle: nil, operacoes: nil) + base = atendidas.da_conta_gade.no_periodo_checkout(inicio, fim) base = base.do_motorista(motorista) if motorista.present? base = base.da_veiculo(vehicle) if vehicle.present? base = base.da_operacoes(operacoes) if operacoes.present? @@ -160,6 +170,11 @@ class Entrega < ApplicationRecord status == 'completed' end + # Insucesso: o motorista foi ao local mas a entrega não foi concluída. + def falhada? + STATUS_FALHA.include?(status) + end + def checkout_registrado? checkout.present? end diff --git a/app/views/consolidacao_entregas/validar.html.erb b/app/views/consolidacao_entregas/validar.html.erb index fffdd18..7d724c2 100644 --- a/app/views/consolidacao_entregas/validar.html.erb +++ b/app/views/consolidacao_entregas/validar.html.erb @@ -100,6 +100,9 @@

NF <%= e.numero_nf %> · <%= e.local %> + <% if e.falhada? %> + ⚠️ Insucesso + <% end %>

📍 <%= e.address.presence || 'sem endereço' %>