Edição para contabilizar as entregas de falha tambem na consolidação
This commit is contained in:
@@ -11,9 +11,10 @@ class ConsolidacaoEntregasController < ApplicationController
|
|||||||
authorize @consolidacao, :show?
|
authorize @consolidacao, :show?
|
||||||
@motorista = params[:motorista]
|
@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.
|
# Período pela DATA REAL (checkout), não pela planejada.
|
||||||
@entregas = Entrega.pagas
|
@entregas = Entrega.atendidas
|
||||||
.da_conta_gade
|
.da_conta_gade
|
||||||
.no_periodo_checkout(@consolidacao.data_inicio, @consolidacao.data_fim)
|
.no_periodo_checkout(@consolidacao.data_inicio, @consolidacao.data_fim)
|
||||||
.do_motorista(@motorista)
|
.do_motorista(@motorista)
|
||||||
@@ -250,11 +251,12 @@ class ConsolidacaoEntregasController < ApplicationController
|
|||||||
nome.present? && @consolidacao.consolidacao_motoristas.exists?(motorista_nome: nome)
|
nome.present? && @consolidacao.consolidacao_motoristas.exists?(motorista_nome: nome)
|
||||||
end
|
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)
|
def tracking_ids_elegiveis(motorista)
|
||||||
return [] unless motorista.present?
|
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)
|
.no_periodo_checkout(@consolidacao.data_inicio, @consolidacao.data_fim)
|
||||||
.do_motorista(motorista)
|
.do_motorista(motorista)
|
||||||
rel = rel.da_veiculo(@consolidacao.vehicle_ids) if @consolidacao.vehicle_ids.present?
|
rel = rel.da_veiculo(@consolidacao.vehicle_ids) if @consolidacao.vehicle_ids.present?
|
||||||
|
|||||||
@@ -139,11 +139,12 @@ class Consolidacao < ApplicationRecord
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Entregas pagas elegíveis para um motorista no período, respeitando o filtro
|
# Entregas elegíveis para um motorista no período (atendidas: sucesso +
|
||||||
# de veículos da consolidação (quando houver). Fonte única usada pelo wizard,
|
# insucesso, pois o motorista foi ao local), respeitando o filtro de veículos
|
||||||
# pela revisão e pelo gate de finalização.
|
# da consolidação (quando houver). Fonte única usada pelo wizard, pela revisão
|
||||||
|
# e pelo gate de finalização.
|
||||||
def entregas_elegiveis_count(motorista)
|
def entregas_elegiveis_count(motorista)
|
||||||
Entrega.contar_pagas(
|
Entrega.contar_atendidas(
|
||||||
inicio: data_inicio,
|
inicio: data_inicio,
|
||||||
fim: data_fim,
|
fim: data_fim,
|
||||||
motorista: motorista,
|
motorista: motorista,
|
||||||
|
|||||||
@@ -17,11 +17,20 @@ class Entrega < ApplicationRecord
|
|||||||
# AJUSTE aqui se o valor real for diferente (ex.: 'cancelled', 'not_delivered').
|
# AJUSTE aqui se o valor real for diferente (ex.: 'cancelled', 'not_delivered').
|
||||||
STATUS_FALHA = %w[failed].freeze
|
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 ──────────────────────────────────────────────────
|
# ── Scopes ──────────────────────────────────────────────────
|
||||||
scope :concluidas, -> { where(status: 'completed') }
|
scope :concluidas, -> { where(status: 'completed') }
|
||||||
scope :com_checkout, -> { where.not(checkout: nil) }
|
scope :com_checkout, -> { where.not(checkout: nil) }
|
||||||
# Pagamento = entrega concluída com checkout registrado
|
# Pagamento = entrega concluída com checkout registrado
|
||||||
scope :pagas, -> { concluidas.com_checkout }
|
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)
|
# Falhadas = entregas que não tiveram sucesso (status de falha)
|
||||||
scope :falhadas, -> { where(status: STATUS_FALHA) }
|
scope :falhadas, -> { where(status: STATUS_FALHA) }
|
||||||
# Pendentes = nem concluídas nem falhadas (ainda em aberto). Exclui as falhadas
|
# 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?)
|
base.distinct.order(:vehicle).pluck(:vehicle).compact.reject(&:empty?)
|
||||||
end
|
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.
|
# Período pela DATA REAL da entrega (checkout) — ver no_periodo_checkout.
|
||||||
def self.contar_pagas(inicio:, fim:, motorista: nil, vehicle: nil, operacoes: nil)
|
def self.contar_atendidas(inicio:, fim:, motorista: nil, vehicle: nil, operacoes: nil)
|
||||||
base = pagas.da_conta_gade.no_periodo_checkout(inicio, fim)
|
base = atendidas.da_conta_gade.no_periodo_checkout(inicio, fim)
|
||||||
base = base.do_motorista(motorista) if motorista.present?
|
base = base.do_motorista(motorista) if motorista.present?
|
||||||
base = base.da_veiculo(vehicle) if vehicle.present?
|
base = base.da_veiculo(vehicle) if vehicle.present?
|
||||||
base = base.da_operacoes(operacoes) if operacoes.present?
|
base = base.da_operacoes(operacoes) if operacoes.present?
|
||||||
@@ -160,6 +170,11 @@ class Entrega < ApplicationRecord
|
|||||||
status == 'completed'
|
status == 'completed'
|
||||||
end
|
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?
|
def checkout_registrado?
|
||||||
checkout.present?
|
checkout.present?
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -100,6 +100,9 @@
|
|||||||
<div class="flex-1 min-w-0">
|
<div class="flex-1 min-w-0">
|
||||||
<p class="text-white font-semibold truncate">
|
<p class="text-white font-semibold truncate">
|
||||||
NF <%= e.numero_nf %> · <%= e.local %>
|
NF <%= e.numero_nf %> · <%= e.local %>
|
||||||
|
<% if e.falhada? %>
|
||||||
|
<span class="ml-1 align-middle text-[10px] font-bold uppercase tracking-wide bg-red-500/20 text-red-400 border border-red-500/40 px-1.5 py-0.5 rounded">⚠️ Insucesso</span>
|
||||||
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
<p class="text-gray-400 text-xs truncate">📍 <%= e.address.presence || 'sem endereço' %></p>
|
<p class="text-gray-400 text-xs truncate">📍 <%= e.address.presence || 'sem endereço' %></p>
|
||||||
<p class="text-gray-500 text-xs">
|
<p class="text-gray-500 text-xs">
|
||||||
|
|||||||
Reference in New Issue
Block a user