# 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:, nota_fiscal:) update!(pago_em: Time.current, pago_por: user&.id, forma_pagamento: forma, nota_fiscal: nota_fiscal) end def cancelar_pagamento!(_user) update!(pago_em: nil, pago_por: nil, forma_pagamento: nil, nota_fiscal: 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