# app/models/operacao_snapshot.rb # # Últimos números conhecidos de uma operação. Comparar com os de agora é o que # permite dizer O QUE mudou — e não só como está. class OperacaoSnapshot < ApplicationRecord CONTADORES = %i[total_notas entregues nao_entregues pendentes].freeze ROTULOS = { total_notas: 'notas na operação', entregues: 'entregues', nao_entregues: 'não entregues', pendentes: 'em aberto' }.freeze validates :tabela, presence: true, uniqueness: true def self.para(tabela) = find_or_initialize_by(tabela: tabela.to_s) def numeros = CONTADORES.index_with { |c| send(c).to_i } # Diferença legível entre o retrato guardado e os números de agora: # { total_notas: +3, pendentes: -1 } => "3 notas na operação a mais, 1 em aberto a menos" def diferenca(atuais) CONTADORES.filter_map do |contador| delta = atuais[contador].to_i - send(contador).to_i next if delta.zero? [contador, delta] end.to_h end def self.descrever(diferenca) diferenca.map do |contador, delta| "#{delta.abs} #{ROTULOS.fetch(contador, contador)} #{delta.positive? ? 'a mais' : 'a menos'}" end.join(', ') end def registrar!(atuais) update!(atuais.merge(capturado_em: Time.current)) end end