Adição da função de configuração de email e whatts

This commit is contained in:
2026-08-11 13:31:22 -03:00
parent e8f470f878
commit e530815377
27 changed files with 1461 additions and 92 deletions

View File

@@ -0,0 +1,62 @@
# Configuração de SMTP e WhatsApp (Twilio) gravada no BANCO, editável pelo ADM
# em /admin/configuracao_notificacao — antes disso tudo vinha só do .env e mudar
# um servidor de e-mail exigia editar o arquivo no servidor e reiniciar.
#
# Tabela SINGLETON: uma linha só. `singleton_guard` com índice único é o que
# impede dois workers Puma criarem linhas concorrentes no primeiro acesso.
#
# As credenciais NÃO são importadas do ENV aqui de propósito: os campos nascem
# vazios e `smtp_ativo`/`whatsapp_ativo` respeitam as flags antigas, então
# `smtp_pronto?`/`whatsapp_pronto?` dão false e o app segue usando o .env
# exatamente como hoje até o admin preencher a tela.
class CreateConfiguracaoNotificacoes < ActiveRecord::Migration[7.1]
def up
create_table :configuracao_notificacoes do |t|
t.integer :singleton_guard, null: false, default: 0
# ── E-mail / SMTP ───────────────────────────────────────
t.boolean :smtp_ativo, null: false, default: false
t.string :smtp_address
t.integer :smtp_port, null: false, default: 587
t.string :smtp_username
t.text :smtp_password_cifrado # AES-256-GCM (concern AtributoCifrado)
t.string :smtp_domain
t.string :smtp_autenticacao, null: false, default: 'plain'
t.string :remetente_email
t.string :remetente_nome
# ── Destinatários administrativos ───────────────────────
t.string :email_admin
t.string :whatsapp_admin
# ── Notificação aos motoristas ──────────────────────────
t.boolean :email_notificacoes_ativo, null: false, default: false
# ── WhatsApp / Twilio ───────────────────────────────────
t.boolean :whatsapp_ativo, null: false, default: false
t.string :twilio_account_sid
t.text :twilio_auth_token_cifrado # AES-256-GCM
t.string :twilio_from
t.timestamps
end
add_index :configuracao_notificacoes, :singleton_guard, unique: true
# Herda as flags que hoje moram em `configuracoes` (chave/valor) e que nunca
# tiveram UI. SQL cru de propósito: migration não deve depender de model.
whats = select_value("SELECT valor FROM configuracoes WHERE chave = 'notificacao_whatsapp'")
email = select_value("SELECT valor FROM configuracoes WHERE chave = 'notificacao_email'")
execute(<<~SQL.squish)
INSERT INTO configuracao_notificacoes
(singleton_guard, whatsapp_ativo, email_notificacoes_ativo, smtp_ativo,
smtp_port, smtp_autenticacao, created_at, updated_at)
VALUES (0, #{whats == 'true'}, #{email == 'true'}, false, 587, 'plain', NOW(), NOW())
SQL
end
def down
drop_table :configuracao_notificacoes
end
end