approval 0.3.7 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/approval/execute_form.rb +57 -0
- data/app/models/approval/request.rb +10 -2
- data/app/models/approval/request_form/base.rb +3 -5
- data/app/models/approval/respond_form/approve.rb +0 -1
- data/app/models/approval/respond_form/approve_with_execute.rb +19 -0
- data/app/models/approval/respond_form/base.rb +3 -5
- data/app/models/concerns/approval/acts_as_user.rb +10 -2
- data/config/locales/en.yml +2 -0
- data/config/locales/ja.yml +2 -0
- data/db/migrate/20180409000000_create_approval_tables.rb +1 -0
- data/lib/approval/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 887c9791882f3ddcad06255f3c51bdce3f3a3bc2c0303f4b08c6675049cab402
|
4
|
+
data.tar.gz: cf49a8a8805feb9197b07d7248032da32b8fa22d8baee4e403c75f5b266627f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acc899127438f3fc8ed8c157fb91cf677a7dab0a41ba54e78300cfe4d9cee722fc530fea6d87d0be1537362ae317432e88d8819de604137afe761044302b4f8c
|
7
|
+
data.tar.gz: 8e2d0d89ce1b639a025f400e0cb0b3e64cd00218fb1b646df538957c63665c9f2e283b4cec710ce588f742512ae32045b471216549bd57fd384b039fa9bf03b2
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Approval
|
2
|
+
class ExecuteForm
|
3
|
+
include ::ActiveModel::Model
|
4
|
+
|
5
|
+
attr_accessor :user, :reason, :request
|
6
|
+
|
7
|
+
def initialize(user:, reason:, request:)
|
8
|
+
@user = user
|
9
|
+
@reason = reason
|
10
|
+
@request = request
|
11
|
+
end
|
12
|
+
|
13
|
+
validates :user, presence: true
|
14
|
+
validates :request, presence: true
|
15
|
+
validates :reason, allow_blank: true, length: { maximum: Approval.config.comment_maximum }
|
16
|
+
|
17
|
+
validate :ensure_request_is_approved
|
18
|
+
validate :ensure_user_same_as_request_user
|
19
|
+
|
20
|
+
def save
|
21
|
+
return false unless valid?
|
22
|
+
|
23
|
+
execute(&:save)
|
24
|
+
end
|
25
|
+
|
26
|
+
def save!
|
27
|
+
raise ::ActiveRecord::RecordInvalid unless valid?
|
28
|
+
|
29
|
+
execute(&:save!)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def execute
|
35
|
+
::Approval::Request.transaction do
|
36
|
+
request.lock!
|
37
|
+
request.comments.new(user_id: user.id, content: reason) if reason
|
38
|
+
request.execute
|
39
|
+
yield(request)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def ensure_request_is_approved
|
44
|
+
return unless request
|
45
|
+
|
46
|
+
errors.add(:request, :is_not_approved) unless request.approved?
|
47
|
+
end
|
48
|
+
|
49
|
+
def ensure_user_same_as_request_user
|
50
|
+
return unless user && request
|
51
|
+
|
52
|
+
unless user.id == request.request_user_id
|
53
|
+
errors.add(:user, :cannot_execute_others_request)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -10,7 +10,7 @@ module Approval
|
|
10
10
|
has_many :comments, class_name: :"Approval::Comment", inverse_of: :request, dependent: :destroy
|
11
11
|
has_many :items, class_name: :"Approval::Item", inverse_of: :request, dependent: :destroy
|
12
12
|
|
13
|
-
enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3 }
|
13
|
+
enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3, executed: 4 }
|
14
14
|
|
15
15
|
scope :recently, -> { order(id: :desc) }
|
16
16
|
|
@@ -28,12 +28,20 @@ module Approval
|
|
28
28
|
self.requested_at = Time.current
|
29
29
|
end
|
30
30
|
|
31
|
+
def execute
|
32
|
+
self.state = :executed
|
33
|
+
self.executed_at = Time.current
|
34
|
+
items.each(&:apply)
|
35
|
+
end
|
36
|
+
|
31
37
|
private
|
32
38
|
|
33
39
|
def ensure_state_was_pending
|
34
40
|
return unless persisted?
|
35
41
|
|
36
|
-
|
42
|
+
if %w[pending approved].exclude?(state_was)
|
43
|
+
errors.add(:base, :already_performed)
|
44
|
+
end
|
37
45
|
end
|
38
46
|
end
|
39
47
|
end
|
@@ -11,11 +11,9 @@ module Approval
|
|
11
11
|
@records = records
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
validates :records
|
18
|
-
end
|
14
|
+
validates :user, presence: true
|
15
|
+
validates :reason, presence: true, length: { maximum: Approval.config.comment_maximum }
|
16
|
+
validates :records, presence: true
|
19
17
|
|
20
18
|
def save
|
21
19
|
return false unless valid?
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Approval
|
2
|
+
module RespondForm
|
3
|
+
class ApproveWithExecute < Base
|
4
|
+
validate :ensure_user_cannot_respond_to_my_request
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def prepare
|
9
|
+
::Approval::Request.transaction do
|
10
|
+
request.lock!
|
11
|
+
request.assign_attributes(state: :approved, approved_at: Time.current, respond_user_id: user.id)
|
12
|
+
request.comments.new(user_id: user.id, content: reason)
|
13
|
+
request.execute
|
14
|
+
yield(request)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -11,11 +11,9 @@ module Approval
|
|
11
11
|
@request = request
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
validates :request
|
18
|
-
end
|
14
|
+
validates :user, presence: true
|
15
|
+
validates :reason, presence: true, length: { maximum: Approval.config.comment_maximum }
|
16
|
+
validates :request, presence: true
|
19
17
|
|
20
18
|
def save
|
21
19
|
return false unless valid?
|
@@ -23,12 +23,20 @@ module Approval
|
|
23
23
|
Approval::RespondForm::Cancel.new(user: self, reason: reason, request: request)
|
24
24
|
end
|
25
25
|
|
26
|
-
def approve_request(request, reason:)
|
27
|
-
|
26
|
+
def approve_request(request, reason:, execute: true)
|
27
|
+
if execute
|
28
|
+
Approval::RespondForm::ApproveWithExecute.new(user: self, reason: reason, request: request)
|
29
|
+
else
|
30
|
+
Approval::RespondForm::Approve.new(user: self, reason: reason, request: request)
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
34
|
def reject_request(request, reason:)
|
31
35
|
Approval::RespondForm::Reject.new(user: self, reason: reason, request: request)
|
32
36
|
end
|
37
|
+
|
38
|
+
def execute_request(request, reason: nil)
|
39
|
+
Approval::ExecuteForm.new(user: self, reason: reason, request: request)
|
40
|
+
end
|
33
41
|
end
|
34
42
|
end
|
data/config/locales/en.yml
CHANGED
@@ -3,6 +3,8 @@ en:
|
|
3
3
|
messages:
|
4
4
|
already_performed: "This request has already performed."
|
5
5
|
cannot_respond_to_own_request: "cannot respond to own request."
|
6
|
+
cannot_execute_others_request: "cannot execute others request."
|
7
|
+
is_not_approved: "is not approved."
|
6
8
|
|
7
9
|
attributes:
|
8
10
|
id: "ID"
|
data/config/locales/ja.yml
CHANGED
data/lib/approval/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: approval
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshiyuki Hirano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- README.md
|
36
36
|
- app/models/approval/application_record.rb
|
37
37
|
- app/models/approval/comment.rb
|
38
|
+
- app/models/approval/execute_form.rb
|
38
39
|
- app/models/approval/item.rb
|
39
40
|
- app/models/approval/request.rb
|
40
41
|
- app/models/approval/request_form/base.rb
|
@@ -42,6 +43,7 @@ files:
|
|
42
43
|
- app/models/approval/request_form/destroy.rb
|
43
44
|
- app/models/approval/request_form/update.rb
|
44
45
|
- app/models/approval/respond_form/approve.rb
|
46
|
+
- app/models/approval/respond_form/approve_with_execute.rb
|
45
47
|
- app/models/approval/respond_form/base.rb
|
46
48
|
- app/models/approval/respond_form/cancel.rb
|
47
49
|
- app/models/approval/respond_form/reject.rb
|