diff --git a/app/controllers/mm/users_controller.rb b/app/controllers/mm/users_controller.rb index 875ca724..793a9ff1 100644 --- a/app/controllers/mm/users_controller.rb +++ b/app/controllers/mm/users_controller.rb @@ -1,7 +1,7 @@ class Mm::UsersController < Base::HyaccController def index - @users = User.paginate page: params[:page], per_page: current_user.slips_per_page + @users = User.includes(:employee).paginate page: params[:page], per_page: current_user.slips_per_page end def show @@ -43,16 +43,50 @@ def update begin @user.transaction do @user.update!(user_params) - - flash[:notice] = 'ユーザを更新しました。' - render 'common/reload' end + + flash[:notice] = 'ユーザを更新しました。' + render 'common/reload' rescue => e handle(e) render :edit end end + def grant_admin + @user = User.find(params[:id]) + begin + @user.transaction do + @user.update!(admin: true) + end + + flash[:notice] = '管理権限を付与しました。' + redirect_after_admin_change + rescue => e + handle(e) + redirect_after_admin_change + end + end + + def revoke_admin + @user = User.find(params[:id]) + begin + @user.transaction do + @user.update!(admin: false) + end + + flash[:notice] = '管理権限を解除しました。' + if current_user.id == @user.id + redirect_to root_path + else + redirect_after_admin_change + end + rescue => e + handle(e) + redirect_after_admin_change + end + end + def destroy id = params[:id].to_i user = User.find(id) @@ -93,6 +127,7 @@ def user_params :zip_code, :address, :sex, :business_office_id, :birth, :my_number ] ] + permitted << :admin if action_name == 'create' ret = params.require(:user).permit(permitted) @@ -103,7 +138,7 @@ def user_params ret end - def employee_params + def employee_params return {} unless params.dig(:employee) permitted = [ branch_employees_attributes: [ @@ -111,4 +146,13 @@ def employee_params ] params.require(:employee).permit(permitted) end -end \ No newline at end of file + + def redirect_after_admin_change + if current_company.personal? + redirect_to action: 'index' + else + redirect_to mm_employees_path + end + end +end + diff --git a/app/models/employee.rb b/app/models/employee.rb index a111da94..2c535d0e 100644 --- a/app/models/employee.rb +++ b/app/models/employee.rb @@ -72,6 +72,10 @@ def disabled_name DISABLED_TYPES[disabled] end + def user_loginable? + user.present? && user.loginable?(self) + end + def fullname(separetor = ' ') "#{last_name}#{separetor}#{first_name}" end diff --git a/app/models/employee_finder.rb b/app/models/employee_finder.rb index aaaeed8c..fc69ca35 100644 --- a/app/models/employee_finder.rb +++ b/app/models/employee_finder.rb @@ -10,7 +10,9 @@ def disabled_types end def list - Employee.where(conditions).paginate(page: page, per_page: per_page) + Employee.where(conditions) + .includes(:user) + .paginate(page: page, per_page: per_page) end private diff --git a/app/models/user.rb b/app/models/user.rb index a0086c05..cfed8c8d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -24,14 +24,22 @@ class User < ApplicationRecord ) } + def loginable?(employee_record = nil) + emp = employee_record || employee + !deleted? && !emp.disabled? && !emp.deleted? + end + def active_admin? - admin? && !deleted? && !employee.disabled? && !employee.deleted? + admin? && loginable? end def would_remove_last_active_admin? - return false unless admin? - return false if deleted_in_database - return false if employee.deleted_in_database || employee.disabled_in_database + was_active = admin_in_database && !deleted_in_database && + !employee.deleted_in_database && !employee.disabled_in_database + return false unless was_active + + will_be_active = admin? && !deleted? && !employee.disabled? && !employee.deleted? + return false if will_be_active company_active_admins = self.class.active_admins.where(employees: { company_id: employee.company_id }) company_active_admins.where.not(id: id).none? diff --git a/app/models/validators/last_active_admin_validator.rb b/app/models/validators/last_active_admin_validator.rb index 59ab6faf..26225285 100644 --- a/app/models/validators/last_active_admin_validator.rb +++ b/app/models/validators/last_active_admin_validator.rb @@ -17,10 +17,17 @@ def validate(record) private def validate_user(user) - return unless user.will_save_change_to_deleted? && user.deleted? + becoming_inactive = (user.will_save_change_to_deleted? && user.deleted?) || + (user.will_save_change_to_admin? && !user.admin?) + return unless becoming_inactive return unless user.would_remove_last_active_admin? - user.errors.add(:base, HyaccErrors::ERR_LAST_ACTIVE_ADMIN_DELETE) + error = if user.will_save_change_to_admin? && !user.admin? + HyaccErrors::ERR_LAST_ACTIVE_ADMIN_REVOKE + else + HyaccErrors::ERR_LAST_ACTIVE_ADMIN_DELETE + end + user.errors.add(:base, error) end def validate_employee(employee) diff --git a/app/utils/hyacc_errors.rb b/app/utils/hyacc_errors.rb index 148415f7..7cd52a03 100644 --- a/app/utils/hyacc_errors.rb +++ b/app/utils/hyacc_errors.rb @@ -30,6 +30,7 @@ module HyaccErrors ERR_ILLEGAL_TAX_DETAIL = "消費税は税抜経理方式の場合のみ指定可能です。" ERR_LAST_ACTIVE_ADMIN_DELETE = "ログイン可能な管理権限を持つユーザーが0人になるため、削除できません。" ERR_LAST_ACTIVE_ADMIN_DISABLE = "ログイン可能な管理権限を持つユーザーが0人になるため、無効にできません。" + ERR_LAST_ACTIVE_ADMIN_REVOKE = "ログイン可能な管理権限を持つユーザーが0人になるため、管理権限を解除できません。" ERR_NO_CAPITATION_TARGET_BRANCH_EXISTS = "人頭割で配賦できる部門がありません。" ERR_NOT_JOURNALIZABLE_ACCOUNT = "仕訳が登録できない勘定科目が指定されています。" ERR_OVERRIDE_NEEDED = "サブクラスでの実装が必要です。" diff --git a/app/views/mm/employees/index.html.erb b/app/views/mm/employees/index.html.erb index b8d5b97c..0de6157c 100644 --- a/app/views/mm/employees/index.html.erb +++ b/app/views/mm/employees/index.html.erb @@ -11,6 +11,7 @@