45 lines
1.7 KiB
Ruby
45 lines
1.7 KiB
Ruby
# app/models/consolidacao_motorista.rb
|
|
class ConsolidacaoMotorista < ApplicationRecord
|
|
# Nome da tabela fixado: o inflector pt-BR (config/initializers/inflections.rb)
|
|
# pode resolver o composto "consolidacao_motorista" no singular errado.
|
|
self.table_name = 'consolidacao_motoristas'
|
|
|
|
belongs_to :consolidacao
|
|
belongs_to :pagador, class_name: 'User', foreign_key: :pago_por, optional: true
|
|
has_many :consolidacao_entregas,
|
|
->(cm) { where(motorista_nome: cm.motorista_nome) },
|
|
foreign_key: :consolidacao_id,
|
|
primary_key: :consolidacao_id
|
|
|
|
validates :motorista_nome, presence: true
|
|
validates :motorista_nome, uniqueness: { scope: :consolidacao_id }
|
|
|
|
before_save :recalcular_valor
|
|
|
|
# ── Pagamento ───────────────────────────────────────────────
|
|
scope :pagos, -> { where.not(pago_em: nil) }
|
|
scope :pendentes, -> { where(pago_em: nil) }
|
|
|
|
def pago?
|
|
pago_em.present?
|
|
end
|
|
|
|
def marcar_pago!(user, forma:)
|
|
update!(pago_em: Time.current, pago_por: user&.id, forma_pagamento: forma)
|
|
end
|
|
|
|
def cancelar_pagamento!(_user)
|
|
update!(pago_em: nil, pago_por: nil, forma_pagamento: nil)
|
|
end
|
|
|
|
def recalcular_valor
|
|
# Fonte única de verdade: o valor_aplicado capturado no momento da
|
|
# classificação (igual ao ConsolidacaoEntregasController#recalcular_motorista).
|
|
# Recalcular pelos preços atuais de Configuracao divergiria caso os preços
|
|
# mudassem depois das entregas já terem sido classificadas.
|
|
self.valor_total = consolidacao_entregas
|
|
.where(motorista_nome: motorista_nome)
|
|
.sum { |e| e.desconto? ? -e.valor_aplicado : e.valor_aplicado }
|
|
end
|
|
end
|