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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 036447a5b614f818fa6a3ace7ee80d56c736d307bf1b8020cca81c2e6458ac07
4
- data.tar.gz: 95feed0024428c045f96adaa675618751481ac9111f3aeafb79e02d6d9e17856
3
+ metadata.gz: 887c9791882f3ddcad06255f3c51bdce3f3a3bc2c0303f4b08c6675049cab402
4
+ data.tar.gz: cf49a8a8805feb9197b07d7248032da32b8fa22d8baee4e403c75f5b266627f7
5
5
  SHA512:
6
- metadata.gz: afdc581773b236d893187061146bbb58e4c3e5760eda31b74a73105c52ee22b3647ad2400f5b31421cf3224b9c5920fcc0f4ae572101721f741e746fd567f19b
7
- data.tar.gz: 05a14a3c41748d87ecbdc9365b3198a7f750be241385966c5a5b55cc53c7c7874fdcb4092c933195a1f43b01dff5c81c91fbdd4ceb5c5e81c4df50fd67f58f8b
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
- errors.add(:base, :already_performed) if state_was != "pending"
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
- with_options presence: true do
15
- validates :user
16
- validates :reason, length: { maximum: Approval.config.comment_maximum }
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?
@@ -10,7 +10,6 @@ module Approval
10
10
  request.lock!
11
11
  request.assign_attributes(state: :approved, approved_at: Time.current, respond_user_id: user.id)
12
12
  request.comments.new(user_id: user.id, content: reason)
13
- request.items.each(&:apply)
14
13
  yield(request)
15
14
  end
16
15
  end
@@ -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
- with_options presence: true do
15
- validates :user
16
- validates :reason, length: { maximum: Approval.config.comment_maximum }
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
- Approval::RespondForm::Approve.new(user: self, reason: reason, request: request)
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
@@ -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"
@@ -3,6 +3,8 @@ ja:
3
3
  messages:
4
4
  already_performed: "申請は既に実行されています"
5
5
  cannot_respond_to_own_request: "は自身の申請のため対応できません"
6
+ cannot_execute_others_request: "は自身の申請ではないため実行できません"
7
+ is_not_approved: "は承認されていません"
6
8
 
7
9
  attributes:
8
10
  id: ID
@@ -8,6 +8,7 @@ class CreateApprovalTables < ActiveRecord::Migration[5.0]
8
8
  t.datetime :cancelled_at
9
9
  t.datetime :approved_at
10
10
  t.datetime :rejected_at
11
+ t.datetime :executed_at
11
12
 
12
13
  t.timestamps
13
14
 
@@ -1,3 +1,3 @@
1
1
  module Approval
2
- VERSION = "0.3.7".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
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.3.7
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-10 00:00:00.000000000 Z
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