Pagamento por checkout + consolidação por veículo (em vez de rota)
Regra de pagamento: - Entrega.pagas agora exige status='completed' E checkout preenchido (antes era checkin). Afeta dashboard, painel do motorista, job 1h e elegibilidade das consolidações de forma consistente. Veículo no lugar de rota na consolidação: - migration troca consolidacoes.route_ids por vehicle_ids (jsonb + gin) - Entrega: da_veiculo/veiculos_unicos; contar_pagas usa vehicle - new.html.erb: filtro "Veículos" (multi-select por vehicle) - validar.html.erb: mostra o veículo em vez do código da rota - filtros/elegibilidade do controller passam a usar vehicle_ids Docs/diagnóstico atualizados. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -73,14 +73,14 @@ class Consolidacao < ApplicationRecord
|
||||
end
|
||||
|
||||
# Entregas pagas elegíveis para um motorista no período, respeitando o filtro
|
||||
# de rotas da consolidação (quando houver). Fonte única usada pelo wizard,
|
||||
# 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(
|
||||
inicio: data_inicio,
|
||||
fim: data_fim,
|
||||
motorista: motorista,
|
||||
route_id: route_ids.presence
|
||||
vehicle: vehicle_ids.presence
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@@ -15,8 +15,9 @@ class Entrega < ApplicationRecord
|
||||
|
||||
# ── Scopes ──────────────────────────────────────────────────
|
||||
scope :concluidas, -> { where(status: 'completed') }
|
||||
scope :com_checkin, -> { where.not(checkin: nil) }
|
||||
scope :pagas, -> { concluidas.com_checkin }
|
||||
scope :com_checkout, -> { where.not(checkout: nil) }
|
||||
# Pagamento = entrega concluída com checkout registrado
|
||||
scope :pagas, -> { concluidas.com_checkout }
|
||||
scope :pendentes, -> { where.not(status: 'completed') }
|
||||
|
||||
scope :no_periodo, ->(inicio, fim) {
|
||||
@@ -27,8 +28,8 @@ class Entrega < ApplicationRecord
|
||||
where(driver: nome)
|
||||
}
|
||||
|
||||
scope :da_rota, ->(route_id) {
|
||||
where(route_id: route_id)
|
||||
scope :da_veiculo, ->(vehicle) {
|
||||
where(vehicle: vehicle)
|
||||
}
|
||||
|
||||
scope :do_mes, ->(data = Date.current) {
|
||||
@@ -48,18 +49,18 @@ class Entrega < ApplicationRecord
|
||||
base.distinct.order(:driver).pluck(:driver).compact.reject(&:empty?)
|
||||
end
|
||||
|
||||
# Lista rotas únicas (route_id → descrição)
|
||||
def self.rotas_unicas(inicio: nil, fim: nil)
|
||||
# Lista veículos únicos (para selects/filtros de consolidação)
|
||||
def self.veiculos_unicos(inicio: nil, fim: nil)
|
||||
base = da_conta_gade
|
||||
base = base.no_periodo(inicio, fim) if inicio && fim
|
||||
base.distinct.pluck(:route_id).compact
|
||||
base.distinct.order(:vehicle).pluck(:vehicle).compact.reject(&:empty?)
|
||||
end
|
||||
|
||||
# Contagem de entregas pagas para cálculo estimado
|
||||
def self.contar_pagas(inicio:, fim:, motorista: nil, route_id: nil)
|
||||
def self.contar_pagas(inicio:, fim:, motorista: nil, vehicle: nil)
|
||||
base = pagas.da_conta_gade.no_periodo(inicio, fim)
|
||||
base = base.do_motorista(motorista) if motorista.present?
|
||||
base = base.da_rota(route_id) if route_id.present?
|
||||
base = base.da_veiculo(vehicle) if vehicle.present?
|
||||
base.count
|
||||
end
|
||||
|
||||
@@ -77,12 +78,12 @@ class Entrega < ApplicationRecord
|
||||
status == 'completed'
|
||||
end
|
||||
|
||||
def checkin_registrado?
|
||||
checkin.present?
|
||||
def checkout_registrado?
|
||||
checkout.present?
|
||||
end
|
||||
|
||||
def elegivel_pagamento?
|
||||
concluida? && checkin_registrado?
|
||||
concluida? && checkout_registrado?
|
||||
end
|
||||
|
||||
def atraso_minutos
|
||||
|
||||
Reference in New Issue
Block a user