42 lines
1.3 KiB
Ruby
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
|