Grande correção do filtro de veiculos na area de consolidação
This commit is contained in:
71
app/models/consolidacao_veiculo.rb
Normal file
71
app/models/consolidacao_veiculo.rb
Normal file
@@ -0,0 +1,71 @@
|
||||
# app/models/consolidacao_veiculo.rb
|
||||
# Unidade de FECHAMENTO por veículo dentro de uma consolidação. Espelha os padrões
|
||||
# de ConsolidacaoMotorista (arquivamento reversível + valor_total recalculado dos
|
||||
# pilares), mas o que ela controla é o estado "fechado/consolidado" de cada carro.
|
||||
# O PAGAMENTO continua no motorista (ConsolidacaoMotorista) — ver [[consolidacao]].
|
||||
class ConsolidacaoVeiculo < ApplicationRecord
|
||||
# Nome da tabela fixado (mesmo motivo dos outros: inflector pt-BR).
|
||||
self.table_name = 'consolidacao_veiculos'
|
||||
|
||||
# Bucket dos lançamentos sem veículo (termo/apontamento manual legado). Igual ao
|
||||
# sentinel usado no controller e na migração — NULL quebraria o índice único.
|
||||
SEM_VEICULO = '(sem veículo)'
|
||||
|
||||
belongs_to :consolidacao
|
||||
belongs_to :fechador, class_name: 'User', foreign_key: :fechado_por, optional: true
|
||||
belongs_to :arquivador, class_name: 'User', foreign_key: :arquivado_por, optional: true
|
||||
|
||||
validates :motorista_nome, presence: true
|
||||
validates :vehicle, presence: true
|
||||
validates :vehicle, uniqueness: { scope: %i[consolidacao_id motorista_nome] }
|
||||
|
||||
before_save :recalcular_valor
|
||||
|
||||
# ── Fechamento (consolidação do veículo, reversível) ────────
|
||||
scope :fechados, -> { where.not(fechado_em: nil) }
|
||||
scope :abertos, -> { where(fechado_em: nil) }
|
||||
|
||||
# ── Arquivamento (reversível) — sai do gate, mantém os dados ─
|
||||
scope :ativos, -> { where(arquivado_em: nil) }
|
||||
scope :arquivados, -> { where.not(arquivado_em: nil) }
|
||||
|
||||
def fechado?
|
||||
fechado_em.present?
|
||||
end
|
||||
|
||||
def arquivado?
|
||||
arquivado_em.present?
|
||||
end
|
||||
|
||||
# update_columns: não dispara before_save (o valor já está correto no fechamento).
|
||||
def fechar!(user)
|
||||
update_columns(fechado_em: Time.current, fechado_por: user&.id, updated_at: Time.current)
|
||||
end
|
||||
|
||||
def reabrir!(_user)
|
||||
update_columns(fechado_em: nil, fechado_por: nil, updated_at: Time.current)
|
||||
end
|
||||
|
||||
def arquivar!(user)
|
||||
update_columns(arquivado_em: Time.current, arquivado_por: user&.id, updated_at: Time.current)
|
||||
end
|
||||
|
||||
def desarquivar!(_user)
|
||||
update_columns(arquivado_em: nil, arquivado_por: nil, updated_at: Time.current)
|
||||
end
|
||||
|
||||
# Soma dos pilares deste (motorista + veículo). Mesma regra do ConsolidacaoMotorista:
|
||||
# o valor_aplicado capturado na classificação é a fonte da verdade e o desconto
|
||||
# subtrai. O bucket "(sem veículo)" casa os pilares com vehicle NULL/vazio.
|
||||
def recalcular_valor
|
||||
self.valor_total = escopo_entregas
|
||||
.sum { |e| e.desconto? ? -e.valor_aplicado : e.valor_aplicado }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def escopo_entregas
|
||||
rel = consolidacao.consolidacao_entregas.where(motorista_nome: motorista_nome)
|
||||
vehicle == SEM_VEICULO ? rel.where(vehicle: [nil, '']) : rel.where(vehicle: vehicle)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user