Implantação da geração de mensagem de forma livre e mudança na engine de mensagem
This commit is contained in:
70
db/migrate/20260824000002_create_notificacao_eventos.rb
Normal file
70
db/migrate/20260824000002_create_notificacao_eventos.rb
Normal file
@@ -0,0 +1,70 @@
|
||||
# Eventos de notificação + assinatura por grupo.
|
||||
#
|
||||
# O ADM cadastra quantos eventos quiser, mas o GATILHO sai de uma lista fixa:
|
||||
# gatilho é código. `manual` cobre o aviso pontual (botão "disparar agora") e
|
||||
# `agendado` cobre o resumo periódico; os demais são pontos que o sistema já
|
||||
# conhece (consolidação finalizada, pagamento efetuado, valor alterado, dados da
|
||||
# operação mudaram).
|
||||
#
|
||||
# `sistema: true` marca os eventos que nascem com o app: podem ser editados e
|
||||
# desligados, mas não apagados — apagar deixaria o código disparando no vazio.
|
||||
class CreateNotificacaoEventos < ActiveRecord::Migration[7.1]
|
||||
GATILHOS = %w[manual consolidacao_finalizada pagamento_efetuado
|
||||
valor_alterado operacao_alterada agendado].freeze
|
||||
|
||||
def up
|
||||
create_table :eventos_notificacao do |t|
|
||||
t.string :nome, null: false
|
||||
t.string :chave, null: false # slug estável usado pelo código
|
||||
t.string :gatilho, null: false
|
||||
t.string :descricao
|
||||
t.boolean :ativo, null: false, default: true
|
||||
t.boolean :sistema, null: false, default: false
|
||||
|
||||
# Avisar também a pessoa diretamente envolvida no fato (o motorista do
|
||||
# pagamento), além dos grupos assinantes. É o comportamento de hoje.
|
||||
t.boolean :notificar_envolvido, null: false, default: true
|
||||
|
||||
# Só para gatilho `agendado`.
|
||||
t.string :frequencia # diaria | semanal
|
||||
t.integer :hora, default: 8 # 0..23
|
||||
t.integer :dia_semana # 0..6 (domingo=0), só na semanal
|
||||
t.datetime :ultimo_disparo_em
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
add_index :eventos_notificacao, :chave, unique: true
|
||||
|
||||
create_table :grupo_evento_assinaturas do |t|
|
||||
t.references :grupo_contato, null: false, foreign_key: true
|
||||
t.references :evento_notificacao, null: false, foreign_key: true
|
||||
t.string :canal, null: false, default: 'ambos' # ambos | whatsapp | email
|
||||
t.boolean :ativo, null: false, default: true
|
||||
t.timestamps
|
||||
end
|
||||
add_index :grupo_evento_assinaturas, %i[grupo_contato_id evento_notificacao_id],
|
||||
unique: true, name: 'index_assinatura_grupo_evento_unico'
|
||||
|
||||
# Os dois eventos que o código JÁ dispara hoje, para nada parar de funcionar
|
||||
# no deploy. SQL cru de propósito: migration não deve depender de model.
|
||||
agora = 'NOW()'
|
||||
[
|
||||
['Pagamento fechado', 'consolidacao_finalizada', 'consolidacao_finalizada',
|
||||
'Disparado quando uma consolidação é finalizada.'],
|
||||
['Pagamento efetuado', 'pagamento_efetuado', 'pagamento_efetuado',
|
||||
'Disparado quando o pagamento de um motorista é marcado como pago.']
|
||||
].each do |nome, chave, gatilho, descricao|
|
||||
execute(<<~SQL.squish)
|
||||
INSERT INTO eventos_notificacao
|
||||
(nome, chave, gatilho, descricao, ativo, sistema, notificar_envolvido, hora, created_at, updated_at)
|
||||
VALUES (#{quote(nome)}, #{quote(chave)}, #{quote(gatilho)}, #{quote(descricao)},
|
||||
true, true, true, 8, #{agora}, #{agora})
|
||||
SQL
|
||||
end
|
||||
end
|
||||
|
||||
def down
|
||||
drop_table :grupo_evento_assinaturas
|
||||
drop_table :eventos_notificacao
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user