75 lines
2.3 KiB
Ruby
75 lines
2.3 KiB
Ruby
# app/models/user.rb
|
|
class User < ApplicationRecord
|
|
devise :database_authenticatable,
|
|
:registerable,
|
|
:recoverable,
|
|
:rememberable,
|
|
:validatable
|
|
|
|
# ── Roles ──────────────────────────────────────────────────
|
|
enum role: { admin: 0, gerente: 1, operador: 2, motorista: 3 }
|
|
|
|
ROLES_LABEL = {
|
|
'admin' => 'Administrador',
|
|
'gerente' => 'Gerente',
|
|
'operador' => 'Operador',
|
|
'motorista' => 'Motorista'
|
|
}.freeze
|
|
|
|
# ── Validações ──────────────────────────────────────────────
|
|
validates :nome, presence: true, length: { minimum: 3 }
|
|
validates :role, presence: true
|
|
validates :pin_code,
|
|
length: { is: 4 },
|
|
numericality: { only_integer: true },
|
|
allow_nil: true,
|
|
if: :motorista?
|
|
|
|
validate :pin_unico_para_motoristas, if: :motorista?
|
|
|
|
# Motoristas podem não ter e-mail (login via PIN)
|
|
def email_required?
|
|
!motorista?
|
|
end
|
|
|
|
def password_required?
|
|
!motorista? ? super : false
|
|
end
|
|
|
|
# ── Escopos ─────────────────────────────────────────────────
|
|
scope :ativos, -> { where(ativo: true) }
|
|
scope :por_nome, -> { order(:nome) }
|
|
scope :nao_motoristas, -> { where.not(role: :motorista) }
|
|
|
|
# ── Helpers ─────────────────────────────────────────────────
|
|
def nome_display
|
|
nome.presence || email
|
|
end
|
|
|
|
def role_label
|
|
ROLES_LABEL[role] || role.humanize
|
|
end
|
|
|
|
def pode_ver_config?
|
|
admin? || gerente?
|
|
end
|
|
|
|
def pode_consolidar?
|
|
admin? || gerente? || operador?
|
|
end
|
|
|
|
# Token de login rápido via QR Code (holerite) — Fase 7/8
|
|
def regenerar_login_token!
|
|
update!(login_token: SecureRandom.urlsafe_base64(24))
|
|
end
|
|
|
|
private
|
|
|
|
def pin_unico_para_motoristas
|
|
return if pin_code.blank?
|
|
|
|
conflito = User.motorista.where(pin_code: pin_code).where.not(id: id)
|
|
errors.add(:pin_code, 'já está em uso por outro motorista') if conflito.exists?
|
|
end
|
|
end
|