Files
Reem-Notas/app/models/operacao_snapshot.rb

42 lines
1.3 KiB
Ruby

# 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