dcidev_approval 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/lib/dcidev_approval.rb +158 -0
  4. metadata +58 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b89d5bed50149b2067004980c70e15f4a4dd63eb4af17c18bbcb1f9a40fe592e
4
+ data.tar.gz: 4fd39a2c3f38e2635c40035d4d2dcd07f524e74a742f3ca4018153edab7cb4cb
5
+ SHA512:
6
+ metadata.gz: a4f1bf7253a23ed2b65a839d3f572f148430fc561c1eec01496cf83ec05d0f2056310c470bbd56fdd044faefe8c263b8704377ffc9be84c431140f7be24abf0c
7
+ data.tar.gz: f9d5add77f39eb625a564eddf8c33a6a9977ed2ec3f913fa7712527fe9f051c74bafbbaa5b76e266850b076fb6f95e1a98e50bcedb3d1ff8042553f11b573d7a
data/README.md ADDED
@@ -0,0 +1 @@
1
+ dcidev_approval
@@ -0,0 +1,158 @@
1
+ module DcidevApproval
2
+ def self.included base
3
+ base.send :include, InstanceMethods
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module InstanceMethods
8
+
9
+ def changes_present?(changes)
10
+ present = false
11
+ changes.each do |k, v|
12
+ begin
13
+ if eval("self.#{k}") != v
14
+ present = true
15
+ break
16
+ end
17
+ rescue => _
18
+ end
19
+ end
20
+ return present
21
+ end
22
+
23
+ def waiting_approval?
24
+ %w[pending_update pending_delete].include?(self.change_status) || self.status == "waiting"
25
+ end
26
+
27
+ def pending_insert?
28
+ self.change_status.nil? && %w[waiting rejected].include?(self.status)
29
+ end
30
+
31
+ def pending_update?
32
+ self.change_status == "pending_update"
33
+ end
34
+
35
+ def pending_delete?
36
+ self.change_status == "pending_delete"
37
+ end
38
+
39
+ def last_modified_by
40
+ # p self.audit_trail
41
+ if self.try(:change_status).present? && self.try(:change_status) == 'pending_delete'
42
+ log = self.activity_logs.where("activity LIKE '%delete%'").limit(1).order(created_at: :desc).try(:first)
43
+ else
44
+ log = self.activity_logs.where("activity LIKE '%edit%'").limit(1).order(created_at: :desc).try(:first)
45
+ end
46
+ {
47
+ modified_by: log.present? ? log.try(:agent).try(:name).to_s + " (#{log.try(:agent).try(:username).to_s}[#{log.try(:agent).try(:roles).try(:first).try(:name)}])" : nil,
48
+ modified_at: log.present? ? log.try(:created_at) || self.try(:updated_at) || self.try(:created_at) : nil
49
+ }
50
+ end
51
+
52
+ def created_by
53
+ log = self.activity_logs.try(:first)
54
+ {
55
+ created_by: log.present? && log.try(:agent).try(:name).present? ? log.try(:agent).try(:name).to_s + " (#{log.try(:agent).try(:username).to_s}[#{log.try(:agent).try(:roles).try(:first).try(:name)}])" : "System",
56
+ created_at: self.try(:created_at) || log.try(:created_at)
57
+ }
58
+ end
59
+
60
+ def last_approved_by
61
+ last_approve = self.activity_logs.where("activity LIKE '%approv%'").limit(1).order(created_at: :desc).try(:first)
62
+ last_entry = self.activity_logs.last
63
+ {
64
+ approved_by: last_approve.try(:id) == last_entry.try(:id) ? last_approve.try(:agent).try(:name) : nil,
65
+ approved_at: last_approve.try(:id) == last_entry.try(:id) ? last_approve.try(:created_at) : nil
66
+ }
67
+ end
68
+
69
+ def approve_changes(params, agent, request)
70
+
71
+ if self.change_status.nil? && %w[waiting rejected].include?(self.status)
72
+ raise self.errors.full_messages.join(", ") unless self.update(status: :approved, data_changes: nil, change_status: nil)
73
+ # ActivityLog.write("Approve insert to #{self.class.to_s}", request, agent, menu, self) if params.log
74
+ # self.delay(queue: "reorder_#{self.id}", priority: 0).reorder if self.class.column_names.include?("view_order")
75
+
76
+ end
77
+ if self.change_status == "pending_update"
78
+ raise self.errors.full_messages.join(", ") unless self.update_by_params(self.data_changes, false)
79
+ raise self.errors.full_messages.join(", ") unless self.update(status: :approved, data_changes: nil, change_status: nil)
80
+ # ActivityLog.write("Approve update to #{self.class.to_s}", request, agent, menu, self) if params.log
81
+ # self.delay(queue: "reorder_#{self.id}", priority: 0).reorder if self.class.column_names.include?("view_order")
82
+
83
+ elsif self.change_status == "pending_delete"
84
+ raise self.errors.full_messages.join(", ") unless self.update(change_status: nil, data_changes: nil)
85
+ ActiveRecord::Base.transaction do
86
+ # ActivityLog.write("Approve delete to #{self.class.to_s}", request, agent, menu, self) if params.log
87
+ self.try(:destroy)
88
+ end
89
+ end
90
+ end
91
+
92
+ def delete_changes(params, agent, request)
93
+ # return unless %w[pending_update pending_delete].include? self.change_status
94
+ raise self.errors.full_messages.join(", ") unless self.update(data_changes: nil, change_status: nil, status: self.status == "waiting" ? :rejected : :approved)
95
+ # ActivityLog.write("Reject changes to #{self.class.to_s}", request, agent, menu, self) if params.log
96
+ end
97
+
98
+ def edit_data(params, agent, request, bypass = true, &block)
99
+ raise "data still waiting for approval" if self.waiting_approval?
100
+ if bypass
101
+ raise self.errors.full_messages.join(", ") unless self.update_by_params(params, false)
102
+ # ActivityLog.write("Edit #{self.class.to_s}", request, agent, menu, self) if params.log
103
+ else
104
+ if self.changes_present?(params)
105
+ ActiveRecord::Base.transaction do
106
+ data = (agent.is_admin? || self.status == "waiting") ? params : { change_status: :pending_update, data_changes: agent.is_admin? ? nil : params }
107
+ raise self.errors.full_messages.join(", ") unless self.update_by_params(data, false)
108
+ end
109
+ # ActivityLog.write("#{agent.is_admin? ? nil : "Request "}Edit #{self.class.to_s}", request, agent, menu, self) if params.log
110
+ end
111
+ end
112
+ yield true
113
+ end
114
+
115
+ def approval(params, agent, request)
116
+ if params.status == "approved"
117
+ self.approve_changes(params, agent, request)
118
+ elsif params.status == "rejected"
119
+ self.delete_changes(params, agent, request)
120
+ end
121
+ yield true
122
+ end
123
+
124
+ def delete_data(params, agent, request, bypass = true)
125
+ raise "data still waiting for approval" if self.waiting_approval?
126
+ if bypass || agent.is_admin?
127
+ ActiveRecord::Base.transaction do
128
+ # ActivityLog.write("Delete #{self.class.to_s}", request, agent, menu, self) if params.log
129
+ raise self.errors.full_messages.join(", ") unless self.destroy
130
+ end
131
+ else
132
+ raise self.errors.full_messages.join(", ") unless self.update(change_status: :pending_delete)
133
+ # ActivityLog.write("Request Delete #{self.class.to_s}", request, agent, menu, self) if params.log
134
+ end
135
+ yield true
136
+ end
137
+ end
138
+
139
+ module ClassMethods
140
+ def create_data(params, agent, request, bypass = true)
141
+ if bypass
142
+ ActiveRecord::Base.transaction do
143
+ data = params.merge!({ status: :approved })
144
+ d = self.new_from_params(data)
145
+ raise d.errors.full_messages.join(", ") unless d.save
146
+ # ActivityLog.write("#{agent.is_admin? ? nil : "Request "} Add #{self.to_s}", request, agent, menu, d) if params.log
147
+ end
148
+ else
149
+ d = self.new_from_params(params)
150
+ d.status = agent.is_admin? ? :approved : :waiting
151
+ raise d.errors.full_messages.join(", ") unless d.save
152
+ # ActivityLog.write("Add #{self.to_s}", request, agent, menu, d) if params.log
153
+ end
154
+ yield d
155
+ end
156
+ end
157
+ end
158
+
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dcidev_approval
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Punto Damar P
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-01-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dcidev_active_record
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Testing phase
28
+ email:
29
+ - punto@privyid.tech
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - README.md
35
+ - lib/dcidev_approval.rb
36
+ homepage:
37
+ licenses: []
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubygems_version: 3.0.6
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Logic for implementing record changes approval
58
+ test_files: []