Implantação da geração de mensagem de forma livre e mudança na engine de mensagem
This commit is contained in:
41
app/models/operacao_snapshot.rb
Normal file
41
app/models/operacao_snapshot.rb
Normal file
@@ -0,0 +1,41 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user