# app/models/notificacao_envio.rb # # Registro de UMA mensagem disparada. Existe para responder "o motorista # recebeu?" — pergunta que hoje só tem resposta no log do Rails, porque o # NotificacaoService engole a exceção de propósito (um SMTP fora do ar não pode # travar o fechamento de um pagamento). # # Com o WhatsApp por sessão QR, que cai sozinha e exige repareamento, essa # pergunta vira rotina — daí o log ser tabela, não linha de arquivo. class NotificacaoEnvio < ApplicationRecord STATUS = %w[pendente enviado falhou].freeze CANAIS = %w[whatsapp email].freeze belongs_to :evento_notificacao, optional: true belongs_to :contato, optional: true belongs_to :user, optional: true validates :canal, inclusion: { in: CANAIS } validates :status, inclusion: { in: STATUS } validates :destino, presence: true scope :recentes, -> { order(created_at: :desc) } scope :falhados, -> { where(status: 'falhou') } scope :enviados, -> { where(status: 'enviado') } scope :no_periodo, ->(inicio, fim) { where(created_at: inicio.to_date.beginning_of_day..fim.to_date.end_of_day) } def marcar_enviado! update!(status: 'enviado', enviado_em: Time.current, erro: nil, tentativas: tentativas + 1) end def marcar_falha!(erro) update!(status: 'falhou', erro: erro.to_s.truncate(2000), tentativas: tentativas + 1) end def enviado? = status == 'enviado' def falhou? = status == 'falhou' end