approval 0.3.7 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|