implantação da fase 2 e 3
This commit is contained in:
25
db/migrate/20260610_add_fase2_fields_to_users.rb
Normal file
25
db/migrate/20260610_add_fase2_fields_to_users.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
# db/migrate/YYYYMMDDHHMMSS_add_fase2_fields_to_users.rb
|
||||
# Renomeie com o timestamp correto: rails g migration AddFase2FieldsToUsers
|
||||
class AddFase2FieldsToUsers < ActiveRecord::Migration[7.1]
|
||||
def change
|
||||
# PIN de acesso (motoristas)
|
||||
add_column :users, :pin_acesso, :string, limit: 4
|
||||
add_index :users, :pin_acesso, unique: true, where: "pin_acesso IS NOT NULL"
|
||||
|
||||
# Status ativo/inativo
|
||||
add_column :users, :ativo, :boolean, default: true, null: false
|
||||
|
||||
# Acompanhamento de login (Devise :trackable)
|
||||
add_column :users, :sign_in_count, :integer, default: 0, null: false unless column_exists?(:users, :sign_in_count)
|
||||
add_column :users, :current_sign_in_at, :datetime unless column_exists?(:users, :current_sign_in_at)
|
||||
add_column :users, :last_sign_in_at, :datetime unless column_exists?(:users, :last_sign_in_at)
|
||||
add_column :users, :current_sign_in_ip, :string unless column_exists?(:users, :current_sign_in_ip)
|
||||
add_column :users, :last_sign_in_ip, :string unless column_exists?(:users, :last_sign_in_ip)
|
||||
|
||||
# Lockable
|
||||
add_column :users, :failed_attempts, :integer, default: 0, null: false unless column_exists?(:users, :failed_attempts)
|
||||
add_column :users, :unlock_token, :string unless column_exists?(:users, :unlock_token)
|
||||
add_column :users, :locked_at, :datetime unless column_exists?(:users, :locked_at)
|
||||
add_index :users, :unlock_token, unique: true unless index_exists?(:users, :unlock_token)
|
||||
end
|
||||
end
|
||||
103
db/seeds.rb
103
db/seeds.rb
@@ -1,47 +1,78 @@
|
||||
# db/seeds.rb
|
||||
# Dados iniciais do sistema Gade Hospitalar
|
||||
# Execute com: bundle exec rails db:seed
|
||||
# Rodar com: docker-compose exec app bundle exec rails db:seed
|
||||
|
||||
puts "🌱 Criando dados iniciais..."
|
||||
puts "🌱 Iniciando seeds..."
|
||||
|
||||
# ── Usuário Admin padrão ─────────────────────────────────────
|
||||
admin = User.find_or_create_by!(email: 'admin@gade.com') do |u|
|
||||
u.nome = 'Administrador Gade'
|
||||
u.password = 'Gade@2026!'
|
||||
u.role = :admin
|
||||
u.ativo = true
|
||||
end
|
||||
puts " ✅ Admin criado: #{admin.email} / senha: Gade@2026!"
|
||||
|
||||
# ── Usuário Gerente de exemplo ───────────────────────────────
|
||||
gerente = User.find_or_create_by!(email: 'gerente@gade.com') do |u|
|
||||
u.nome = 'Gerente Gade'
|
||||
u.password = 'Gade@2026!'
|
||||
u.role = :gerente
|
||||
u.ativo = true
|
||||
end
|
||||
puts " ✅ Gerente criado: #{gerente.email}"
|
||||
|
||||
# ── Configurações de preço padrão ────────────────────────────
|
||||
# ─── Configurações de preço (Fase 1 + confirmação) ───────────────────────────
|
||||
configs = [
|
||||
{ chave: 'preco_entrega', valor: '15.00', descricao: 'Valor pago por entrega bem-sucedida (R$)' },
|
||||
{ chave: 'preco_retirada', valor: '20.00', descricao: 'Valor pago por retirada de equipamento (R$)' },
|
||||
{ chave: 'preco_bonus', valor: '10.00', descricao: 'Valor de bônus por meta/critério (R$)' },
|
||||
{ chave: 'preco_desconto', valor: '15.00', descricao: 'Valor descontado por problema (R$)' },
|
||||
{ chave: 'notificacao_whatsapp', valor: 'false', descricao: 'Notificações via WhatsApp (true/false)' },
|
||||
{ chave: 'notificacao_email', valor: 'false', descricao: 'Notificações via e-mail (true/false)' },
|
||||
{ chave: 'empresa_nome', valor: 'Gade Hospitalar', descricao: 'Nome da empresa exibido no sistema' },
|
||||
{ tipo: :entrega, valor: 10.50, descricao: 'Entrega padrão para UBS, EMAD, STS, SAD' },
|
||||
{ tipo: :retirada, valor: 8.00, descricao: 'Retirada de material nos pontos de origem' },
|
||||
{ tipo: :bonus, valor: 5.00, descricao: 'Bônus por desempenho / entregas especiais' },
|
||||
{ tipo: :desconto, valor: 2.00, descricao: 'Desconto aplicado por ocorrência' }
|
||||
]
|
||||
|
||||
configs.each do |cfg|
|
||||
Configuracao.find_or_create_by!(chave: cfg[:chave]) do |c|
|
||||
c.valor = cfg[:valor]
|
||||
c.descricao = cfg[:descricao]
|
||||
configs.each do |c|
|
||||
Configuracao.find_or_create_by!(tipo: c[:tipo]) do |cfg|
|
||||
cfg.valor = c[:valor]
|
||||
cfg.descricao = c[:descricao]
|
||||
end
|
||||
end
|
||||
puts " ✅ #{Configuracao.count} configurações de preço"
|
||||
|
||||
# ─── Usuários ────────────────────────────────────────────────────────────────
|
||||
usuarios = [
|
||||
{
|
||||
name: 'Admin Gade',
|
||||
email: 'admin@gade.com',
|
||||
password: 'Gade@2026!',
|
||||
role: :admin,
|
||||
ativo: true
|
||||
},
|
||||
{
|
||||
name: 'Gerente Operações',
|
||||
email: 'gerente@gade.com',
|
||||
password: 'Gade@2026!',
|
||||
role: :gerente,
|
||||
ativo: true
|
||||
},
|
||||
{
|
||||
name: 'Operador Entregas',
|
||||
email: 'operador@gade.com',
|
||||
password: 'Gade@2026!',
|
||||
role: :operador,
|
||||
ativo: true
|
||||
},
|
||||
# Motoristas com PIN
|
||||
{ name: 'João Silva', role: :motorista, pin_acesso: '1234', ativo: true },
|
||||
{ name: 'Maria Oliveira', role: :motorista, pin_acesso: '5678', ativo: true },
|
||||
{ name: 'Carlos Santos', role: :motorista, pin_acesso: '9012', ativo: true }
|
||||
]
|
||||
|
||||
usuarios.each do |u|
|
||||
user = User.find_or_initialize_by(
|
||||
u[:role] == :motorista ? { name: u[:name], role: :motorista } : { email: u[:email] }
|
||||
)
|
||||
|
||||
user.assign_attributes(u.except(:email))
|
||||
user.email = u[:email] || "#{u[:name].downcase.gsub(' ', '.')}@gade.local"
|
||||
user.password = u[:password] || SecureRandom.hex(12) if user.new_record?
|
||||
|
||||
if user.save
|
||||
puts " ✅ #{user.role.upcase}: #{user.name}"
|
||||
else
|
||||
puts " ⚠️ #{user.name}: #{user.errors.full_messages.join(', ')}"
|
||||
end
|
||||
puts " ✅ Config: #{cfg[:chave]} = #{cfg[:valor]}"
|
||||
end
|
||||
|
||||
puts ""
|
||||
puts "✅ Seeds concluídos!"
|
||||
puts " Admin: admin@gade.com / Gade@2026!"
|
||||
puts " ⚠️ ALTERE A SENHA DO ADMIN NO PRIMEIRO ACESSO!"
|
||||
puts ""
|
||||
puts "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
puts " Admin: admin@gade.com / Gade@2026!"
|
||||
puts " Gerente: gerente@gade.com / Gade@2026!"
|
||||
puts " Operador: operador@gade.com / Gade@2026!"
|
||||
puts " Motorista João: PIN 1234"
|
||||
puts " Motorista Maria: PIN 5678"
|
||||
puts " Motorista Carlos: PIN 9012"
|
||||
puts " ⚠️ ALTERE AS SENHAS NO PRIMEIRO ACESSO!"
|
||||
puts "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
Reference in New Issue
Block a user