dscf-credit 0.1.1 → 0.1.2

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/dscf/credit/reviewable.rb +112 -0
  3. data/app/controllers/dscf/credit/categories_controller.rb +3 -2
  4. data/app/controllers/dscf/credit/credit_lines_controller.rb +11 -38
  5. data/app/controllers/dscf/credit/facilitators_controller.rb +39 -150
  6. data/app/controllers/dscf/credit/scoring_param_types_controller.rb +31 -0
  7. data/app/controllers/dscf/credit/scoring_parameters_controller.rb +13 -8
  8. data/app/controllers/dscf/credit/system_configs_controller.rb +10 -7
  9. data/app/models/dscf/credit/category.rb +1 -1
  10. data/app/models/dscf/credit/credit_line.rb +7 -4
  11. data/app/models/dscf/credit/facilitator.rb +5 -4
  12. data/app/models/dscf/credit/facilitator_performance.rb +1 -2
  13. data/app/models/dscf/credit/loan_profile.rb +4 -3
  14. data/app/models/dscf/credit/loan_profile_scoring_spec.rb +3 -4
  15. data/app/models/dscf/credit/scoring_param_type.rb +17 -0
  16. data/app/models/dscf/credit/scoring_parameter.rb +7 -6
  17. data/app/models/dscf/credit/system_config.rb +5 -4
  18. data/app/serializers/dscf/credit/category_serializer.rb +1 -1
  19. data/app/serializers/dscf/credit/credit_line_serializer.rb +2 -2
  20. data/app/serializers/dscf/credit/facilitator_performance_serializer.rb +1 -1
  21. data/app/serializers/dscf/credit/facilitator_serializer.rb +2 -2
  22. data/app/serializers/dscf/credit/scoring_param_type_serializer.rb +7 -0
  23. data/app/serializers/dscf/credit/scoring_parameter_serializer.rb +4 -3
  24. data/app/serializers/dscf/credit/system_config_serializer.rb +2 -2
  25. data/app/services/dscf/credit/facilitator_approval_service.rb +4 -3
  26. data/app/services/dscf/credit/facilitator_creation_service.rb +157 -0
  27. data/config/locales/en.yml +46 -8
  28. data/config/routes.rb +23 -6
  29. data/db/migrate/20250822091011_create_dscf_credit_categories.rb +2 -0
  30. data/db/migrate/20250822091131_create_dscf_credit_credit_lines.rb +7 -4
  31. data/db/migrate/20250822091820_create_dscf_credit_system_configs.rb +5 -2
  32. data/db/migrate/20250822092040_create_dscf_credit_scoring_param_types.rb +12 -0
  33. data/db/migrate/20250822092050_create_dscf_credit_scoring_parameters.rb +11 -6
  34. data/db/migrate/20250822092246_create_dscf_credit_loan_profiles.rb +5 -3
  35. data/db/migrate/20250822092417_create_dscf_credit_loan_profile_scoring_specs.rb +5 -4
  36. data/db/migrate/20250822092436_create_dscf_credit_facilitators.rb +5 -2
  37. data/db/migrate/20250822092528_create_dscf_credit_facilitator_performances.rb +0 -3
  38. data/db/seeds.rb +48 -20
  39. data/lib/dscf/credit/version.rb +1 -1
  40. data/spec/factories/dscf/credit/categories.rb +1 -0
  41. data/spec/factories/dscf/credit/credit_lines.rb +7 -5
  42. data/spec/factories/dscf/credit/facilitator_performances.rb +0 -5
  43. data/spec/factories/dscf/credit/facilitators.rb +6 -1
  44. data/spec/factories/dscf/credit/loan_profile_scoring_specs.rb +3 -6
  45. data/spec/factories/dscf/credit/loan_profiles.rb +10 -6
  46. data/spec/factories/dscf/credit/scoring_param_types.rb +31 -0
  47. data/spec/factories/dscf/credit/scoring_parameters.rb +26 -4
  48. data/spec/factories/dscf/credit/system_configs.rb +8 -2
  49. metadata +23 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48da97a9ea6344abf871d97bda581670dbe6091760ff9a0eab34d1816d548236
4
- data.tar.gz: 1eee4be4d65744fde0baa13e865a82dc1482789a6c6cdabbd16deab05c2f6683
3
+ metadata.gz: 226454dfdada01577236a828d48ac886241ba1ca0681cf2ba6ea5f56958d0288
4
+ data.tar.gz: 4d5855466e0a7e5e9d7e7a9f861500b0ca46dd6a77ab0181de340fc226f646c1
5
5
  SHA512:
6
- metadata.gz: 5b5ecf3fb9ccd373f8ba718348f52d5b06a5c033e0b7a706ef8cc2eb60e35b7a43d5a315e5bb3b9cf7896198ff935cdce46ef6ac2b65f0d6eb6891c90a5a4a42
7
- data.tar.gz: 66377466c007cb2880434c37fc25db5da940c644e1d2c8c5131e39e7e451fb5e73d1a38e2fa44b383b4692bfc9913e4a8bfbc73dd9fa657dd7fa8b451a0536f2
6
+ metadata.gz: f9ee24827894995bf986b3b580cb1b08a8e0bdcd9656eb28d0b3107f288eafaad16537ed6b1066869243508c92648f31a3a8ad7429da674186935aed44fa670c
7
+ data.tar.gz: 42550e6f1341e2acf9ff5a6643aca6e8c02b1ec25574b8fc7e20194cd935d987525c062a5cfb6732c5bb3df398518837f110bf90a9b85670d785a40e3bea4a8d
@@ -0,0 +1,112 @@
1
+ module Dscf
2
+ module Credit
3
+ module Reviewable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :set_reviewable_resource, only: %i[approve reject request_modification resubmit]
8
+ end
9
+
10
+ # PATCH /resource/:id/approve
11
+ def approve
12
+ if reviewable_resource.update(
13
+ status: :approved,
14
+ reviewed_by: current_reviewer,
15
+ review_date: Time.current
16
+ )
17
+ render_success(data: reviewable_resource)
18
+ else
19
+ render_error(errors: reviewable_resource.errors.full_messages)
20
+ end
21
+ end
22
+
23
+ # PATCH /resource/:id/request_modification
24
+ def request_modification
25
+ feedback = safe_feedback_param! or return
26
+
27
+ if reviewable_resource.update(
28
+ status: :modify,
29
+ review_feedback: feedback,
30
+ reviewed_by: current_reviewer,
31
+ review_date: Time.current
32
+ )
33
+ render_success(data: reviewable_resource)
34
+ else
35
+ render_error(errors: reviewable_resource.errors.full_messages)
36
+ end
37
+ end
38
+
39
+ # PATCH /resource/:id/reject
40
+ def reject
41
+ feedback = safe_feedback_param! or return
42
+
43
+ unless feedback.key?("message")
44
+ return render_error(errors: "Provide review_feedback with a 'message' key")
45
+ end
46
+
47
+ if reviewable_resource.update(
48
+ status: :rejected,
49
+ review_feedback: feedback,
50
+ reviewed_by: current_reviewer,
51
+ review_date: Time.current
52
+ )
53
+ render_success(data: reviewable_resource)
54
+ else
55
+ render_error(errors: reviewable_resource.errors.full_messages)
56
+ end
57
+ end
58
+
59
+ # PATCH /resource/:id/resubmit
60
+ def resubmit
61
+ unless reviewable_resource.status.to_s == "modify"
62
+ return render_error(errors: "Only items with status 'modify' can be resubmitted", status: :unprocessable_entity)
63
+ end
64
+
65
+ updates = model_params.merge(
66
+ status: :pending,
67
+ review_feedback: {},
68
+ )
69
+
70
+ if reviewable_resource.update(updates)
71
+ render_success(data: reviewable_resource)
72
+ else
73
+ render_error(errors: reviewable_resource.errors.full_messages)
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def safe_feedback_param!
80
+ feedback = params[:review_feedback]
81
+ unless feedback.respond_to?(:to_unsafe_h)
82
+ render_error(errors: "review_feedback must be a JSON object") and return
83
+ end
84
+ feedback.to_unsafe_h
85
+ end
86
+
87
+ def model_class
88
+ model_name = controller_name.classify
89
+
90
+ controller_namespace = self.class.name.deconstantize
91
+ "#{controller_namespace}::#{model_name}".constantize
92
+ rescue NameError
93
+ model_name.constantize
94
+ end
95
+
96
+ def reviewable_resource
97
+ @reviewable_resource ||= model_class.find(params[:id])
98
+ end
99
+
100
+ # Override if current_user is not the reviewer
101
+ def current_reviewer
102
+ current_user
103
+ end
104
+
105
+ def set_reviewable_resource
106
+ reviewable_resource
107
+ rescue ActiveRecord::RecordNotFound => e
108
+ render_error("errors.record_not_found", status: :not_found, errors: [ e.message ])
109
+ end
110
+ end
111
+ end
112
+ end
@@ -8,7 +8,8 @@ module Dscf::Credit
8
8
  params.require(:category).permit(
9
9
  :type,
10
10
  :name,
11
- :description
11
+ :description,
12
+ :document_reference
12
13
  )
13
14
  end
14
15
 
@@ -17,7 +18,7 @@ module Dscf::Credit
17
18
  end
18
19
 
19
20
  def allowed_order_columns
20
- %w[id type name description created_at updated_at]
21
+ %w[id type name description document_reference created_at updated_at]
21
22
  end
22
23
 
23
24
  def default_serializer_includes
@@ -1,6 +1,7 @@
1
1
  module Dscf::Credit
2
2
  class CreditLinesController < ApplicationController
3
3
  include Dscf::Core::Common
4
+ include Dscf::Credit::Reviewable
4
5
 
5
6
  def create
6
7
  super do
@@ -10,36 +11,6 @@ module Dscf::Credit
10
11
  end
11
12
  end
12
13
 
13
- def approve
14
- @obj = @clazz.find(params[:id])
15
- if @obj.update(
16
- status: "approved",
17
- approved_by: current_user,
18
- approval_date: Time.current
19
- )
20
- render_success(data: @obj)
21
- else
22
- render_error(errors: @obj.errors.full_messages, status: :unprocessable_entity)
23
- end
24
- rescue StandardError => e
25
- render_error(error: e.message)
26
- end
27
-
28
- def reject
29
- @obj = @clazz.find(params[:id])
30
- if @obj.update(
31
- status: "pending",
32
- approved_by: current_user,
33
- approval_date: Time.current
34
- )
35
- render_success(data: @obj)
36
- else
37
- render_error(errors: @obj.errors.full_messages, status: :unprocessable_entity)
38
- end
39
- rescue StandardError => e
40
- render_error(error: e.message)
41
- end
42
-
43
14
  private
44
15
 
45
16
  def model_params
@@ -50,26 +21,28 @@ module Dscf::Credit
50
21
  :code,
51
22
  :description,
52
23
  :status,
53
- :approved_by_type,
54
- :approved_by_id,
55
- :approval_date
24
+ :reviewed_by_type,
25
+ :reviewed_by_id,
26
+ :review_date,
27
+ :document_reference,
28
+ :review_feedback
56
29
  )
57
30
  end
58
31
 
59
32
  def eager_loaded_associations
60
- [ :bank, :category, :created_by, :approved_by, :credit_line_specs ]
33
+ [ :bank, :category, :created_by, :reviewed_by, :credit_line_specs ]
61
34
  end
62
35
 
63
36
  def allowed_order_columns
64
- %w[id name code status approval_date created_at updated_at category_id]
37
+ %w[id name code status review_date created_at updated_at category_id]
65
38
  end
66
39
 
67
40
  def default_serializer_includes
68
41
  {
69
42
  index: [ :bank, :category ],
70
- show: [ :bank, :category, :created_by, :approved_by, :credit_line_specs ],
71
- create: [ :bank, :category, :created_by, :approved_by ],
72
- update: [ :bank, :category, :created_by, :approved_by, :credit_line_specs ]
43
+ show: [ :bank, :category, :created_by, :reviewed_by, :credit_line_specs ],
44
+ create: [ :bank, :category, :created_by, :reviewed_by ],
45
+ update: [ :bank, :category, :created_by, :reviewed_by, :credit_line_specs ]
73
46
  }
74
47
  end
75
48
  end
@@ -2,36 +2,14 @@ module Dscf::Credit
2
2
  class FacilitatorsController < ApplicationController
3
3
  include Dscf::Core::Common
4
4
 
5
- skip_before_action :authenticate_user, only: [ :submit_additional_info ]
6
5
  before_action :set_facilitator_for_approval, only: [ :approve, :reject, :set_limit ]
7
6
 
8
7
  def create
9
8
  super do
10
- user = Dscf::Core::User.find(model_params[:user_id])
11
- business = user.businesses.first
12
-
13
- unless business
14
- return render_error("facilitator.errors.no_business",
15
- errors: "User must have a business associated to become a facilitator")
16
- end
17
-
18
- facilitator_data = model_params.to_h.merge(
19
- name: business.name,
20
- type: business.business_type.name.downcase
21
- )
22
-
23
- facilitator = @clazz.new(facilitator_data)
24
- facilitator.kyc_approved_by = current_user
25
- if facilitator.save
26
- facilitator.facilitator_performances.create!(
27
- total_outstanding_loans: 0,
28
- total_outstanding_amount: 0.0,
29
- approval_required: false,
30
- created_by: current_user
31
- )
32
- facilitator
33
- else
34
- facilitator
9
+ begin
10
+ FacilitatorCreationService.new(current_user, @clazz).create_single(model_params)
11
+ rescue StandardError => e
12
+ return render_error(errors: e.message)
35
13
  end
36
14
  end
37
15
  end
@@ -39,27 +17,27 @@ module Dscf::Credit
39
17
  def approve
40
18
  begin
41
19
  FacilitatorApprovalService.new(@facilitator, current_user).approve(params[:total_limit])
42
- render_success("facilitator.success.approved", data: @facilitator)
20
+ render_success(data: @facilitator)
43
21
  rescue StandardError => e
44
- render_error("facilitator.errors.approval_failed", errors: e.message)
22
+ render_error(errors: e.message)
45
23
  end
46
24
  end
47
25
 
48
26
  def reject
49
27
  begin
50
- FacilitatorApprovalService.new(@facilitator, current_user).reject(params[:rejection_reason])
51
- render_success("facilitator.success.rejected", data: @facilitator)
28
+ FacilitatorApprovalService.new(@facilitator, current_user).reject(params[:review_feedback])
29
+ render_success(data: @facilitator)
52
30
  rescue StandardError => e
53
- render_error("facilitator.errors.rejection_failed", errors: e.message)
31
+ render_error(errors: e.message)
54
32
  end
55
33
  end
56
34
 
57
35
  def set_limit
58
36
  begin
59
37
  FacilitatorApprovalService.new(@facilitator, current_user).set_limit(params[:total_limit])
60
- render_success("facilitator.success.limit_updated", data: @facilitator)
38
+ render_success(data: @facilitator)
61
39
  rescue StandardError => e
62
- render_error("facilitator.errors.limit_update_failed", errors: e.message)
40
+ render_error(errors: e.message)
63
41
  end
64
42
  end
65
43
 
@@ -69,123 +47,32 @@ module Dscf::Credit
69
47
 
70
48
  begin
71
49
  result = FacilitatorAdditionalInfoService.new.submit_info(facilitator_id, additional_info)
72
- render_success("facilitator.success.additional_info_submitted", data: result)
50
+ render_success(data: result)
73
51
  rescue StandardError => e
74
- render_error("facilitator.errors.additional_info_failed", errors: e.message)
52
+ render_error(errors: e.message)
75
53
  end
76
54
  end
77
55
 
78
56
  def batch_create
79
57
  facilitators_params = params[:facilitators]
80
58
 
81
- unless facilitators_params.is_a?(Array)
82
- return render_error("facilitator.errors.invalid_batch_format",
83
- errors: "Expected an array of facilitator objects")
84
- end
85
-
86
- if facilitators_params.empty?
87
- return render_error("facilitator.errors.empty_batch",
88
- errors: "At least one facilitator is required")
89
- end
90
-
91
- if facilitators_params.length > 100
92
- return render_error("facilitator.errors.batch_too_large",
93
- errors: "Maximum 100 facilitators allowed per batch")
94
- end
95
-
96
- results = {
97
- successful: [],
98
- failed: [],
99
- total_count: facilitators_params.length,
100
- success_count: 0,
101
- failure_count: 0
102
- }
59
+ begin
60
+ service = FacilitatorCreationService.new(current_user, @clazz)
61
+ results = service.create_batch(facilitators_params)
103
62
 
104
- facilitators_params.each_with_index do |facilitator_attrs, index|
105
- begin
106
- if facilitator_attrs.is_a?(ActionController::Parameters)
107
- permitted_attrs = facilitator_attrs.permit(:user_id, :bank_id, :kyc_status)
108
- else
109
- permitted_attrs = ActionController::Parameters.new(facilitator_attrs)
110
- .permit(:user_id, :bank_id, :kyc_status)
111
- end
112
-
113
- user = Dscf::Core::User.find(permitted_attrs[:user_id])
114
- business = user.businesses.first
115
-
116
- unless business
117
- results[:failed] << {
118
- index: index,
119
- user_id: permitted_attrs[:user_id],
120
- errors: [ "User must have a business associated to become a facilitator" ]
121
- }
122
- results[:failure_count] += 1
123
- next
124
- end
125
-
126
- facilitator_data = permitted_attrs.to_h.merge(
127
- name: business.name,
128
- type: business.business_type.name.downcase
129
- )
130
-
131
- facilitator = @clazz.new(facilitator_data)
132
- facilitator.kyc_approved_by = current_user
133
-
134
- if facilitator.save
135
- facilitator.facilitator_performances.create!(
136
- total_outstanding_loans: 0,
137
- total_outstanding_amount: 0.0,
138
- approval_required: false,
139
- created_by: current_user
140
- )
141
-
142
- results[:successful] << {
143
- index: index,
144
- id: facilitator.id,
145
- name: facilitator.name,
146
- message: "Successfully created"
147
- }
148
- results[:success_count] += 1
149
- else
150
- results[:failed] << {
151
- index: index,
152
- name: business&.name || "Unknown Business",
153
- errors: facilitator.errors.full_messages
154
- }
155
- results[:failure_count] += 1
156
- end
157
- rescue StandardError => e
158
- user_id = permitted_attrs&.[](:user_id) || facilitator_attrs.try(:[], :user_id)
159
- business_name = "Unknown Business"
160
-
161
- if user_id
162
- begin
163
- user = Dscf::Core::User.find(user_id)
164
- business_name = user.businesses.first&.name || "No Business Associated"
165
- rescue
166
- business_name = "Invalid User ID"
167
- end
168
- end
169
-
170
- results[:failed] << {
171
- index: index,
172
- name: business_name,
173
- errors: [ e.message ]
174
- }
175
- results[:failure_count] += 1
63
+ if results[:failure_count] == 0
64
+ render_success("facilitator.success.batch_created_all", data: results)
65
+ elsif results[:success_count] == 0
66
+ render_error("facilitator.errors.batch_failed_all", errors: results)
67
+ else
68
+ render json: {
69
+ success: true,
70
+ message: I18n.t("facilitator.success.batch_created_partial"),
71
+ data: results
72
+ }, status: :multi_status
176
73
  end
177
- end
178
-
179
- if results[:failure_count] == 0
180
- render_success("facilitator.success.batch_created_all", data: results)
181
- elsif results[:success_count] == 0
182
- render_error("facilitator.errors.batch_failed_all", errors: results)
183
- else
184
- render json: {
185
- success: true,
186
- message: I18n.t("facilitator.success.batch_created_partial"),
187
- data: results
188
- }, status: :multi_status
74
+ rescue StandardError => e
75
+ render_error("facilitator.errors.batch_creation_failed", errors: e.message)
189
76
  end
190
77
  end
191
78
 
@@ -196,7 +83,9 @@ module Dscf::Credit
196
83
  :user_id,
197
84
  :bank_id,
198
85
  :kyc_status,
199
- :additional_info
86
+ :kyc_review_date,
87
+ :additional_info,
88
+ :review_feedback
200
89
  )
201
90
  end
202
91
 
@@ -205,22 +94,22 @@ module Dscf::Credit
205
94
  end
206
95
 
207
96
  def eager_loaded_associations
208
- [ :user, :bank, :kyc_approved_by, :facilitator_performances ]
97
+ [ :user, :bank, :kyc_reviewed_by, :facilitator_performances ]
209
98
  end
210
99
 
211
100
  def allowed_order_columns
212
- %w[id name type kyc_status total_limit created_at updated_at]
101
+ %w[id name type kyc_status total_limit kyc_review_date created_at updated_at]
213
102
  end
214
103
 
215
104
  def default_serializer_includes
216
105
  {
217
106
  index: [ :user, :bank ],
218
- show: [ :user, :bank, :kyc_approved_by, :facilitator_performances ],
219
- create: [ :user, :bank, :kyc_approved_by ],
220
- update: [ :user, :bank, :kyc_approved_by, :facilitator_performances ],
221
- approve: [ :user, :bank, :kyc_approved_by, :facilitator_performances ],
222
- reject: [ :user, :bank, :kyc_approved_by ],
223
- set_limit: [ :user, :bank, :kyc_approved_by ]
107
+ show: [ :user, :bank, :kyc_reviewed_by, :facilitator_performances ],
108
+ create: [ :user, :bank, :kyc_reviewed_by ],
109
+ update: [ :user, :bank, :kyc_reviewed_by, :facilitator_performances ],
110
+ approve: [ :user, :bank, :kyc_reviewed_by, :facilitator_performances ],
111
+ reject: [ :user, :bank, :kyc_reviewed_by ],
112
+ set_limit: [ :user, :bank, :kyc_reviewed_by ]
224
113
  }
225
114
  end
226
115
  end
@@ -0,0 +1,31 @@
1
+ module Dscf::Credit
2
+ class ScoringParamTypesController < ApplicationController
3
+ include Dscf::Core::Common
4
+
5
+ private
6
+
7
+ def model_params
8
+ params.require(:scoring_param_type).permit(
9
+ :name,
10
+ :description
11
+ )
12
+ end
13
+
14
+ def eager_loaded_associations
15
+ [ :scoring_parameters ]
16
+ end
17
+
18
+ def allowed_order_columns
19
+ %w[id name created_at updated_at]
20
+ end
21
+
22
+ def default_serializer_includes
23
+ {
24
+ index: [],
25
+ show: [ :scoring_parameters ],
26
+ create: [],
27
+ update: [ :scoring_parameters ]
28
+ }
29
+ end
30
+ end
31
+ end
@@ -1,12 +1,13 @@
1
1
  module Dscf::Credit
2
2
  class ScoringParametersController < ApplicationController
3
3
  include Dscf::Core::Common
4
+ include Dscf::Credit::Reviewable
4
5
 
5
6
  def create
6
7
  super do
7
8
  scoring_parameter = @clazz.new(model_params)
8
9
  scoring_parameter.created_by = current_user
9
- scoring_parameter.approved_by = current_user
10
+ scoring_parameter.reviewed_by = current_user
10
11
 
11
12
  scoring_parameter
12
13
  end
@@ -20,30 +21,34 @@ module Dscf::Credit
20
21
  :name,
21
22
  :description,
22
23
  :data_type,
23
- :type,
24
24
  :weight,
25
25
  :min_value,
26
26
  :max_value,
27
27
  :active,
28
28
  :previous_version_id,
29
- :expires_at
29
+ :review_date,
30
+ :source,
31
+ :scoring_param_type_id,
32
+ :document_reference,
33
+ :status,
34
+ :review_feedback
30
35
  )
31
36
  end
32
37
 
33
38
  def eager_loaded_associations
34
- [ :bank, :created_by, :approved_by, :previous_version, :parameter_normalizers ]
39
+ [ :bank, :created_by, :reviewed_by, :scoring_param_type, :previous_version, :parameter_normalizers ]
35
40
  end
36
41
 
37
42
  def allowed_order_columns
38
- %w[id name data_type type weight active expires_at created_at updated_at]
43
+ %w[id name data_type weight active review_date created_at updated_at]
39
44
  end
40
45
 
41
46
  def default_serializer_includes
42
47
  {
43
48
  index: [ :bank ],
44
- show: [ :bank, :created_by, :approved_by, :previous_version, :parameter_normalizers ],
45
- create: [ :bank, :created_by, :approved_by ],
46
- update: [ :bank, :created_by, :approved_by, :parameter_normalizers ]
49
+ show: [ :bank, :created_by, :reviewed_by, :scoring_param_type, :previous_version, :parameter_normalizers ],
50
+ create: [ :bank, :created_by, :reviewed_by, :scoring_param_type ],
51
+ update: [ :bank, :created_by, :reviewed_by, :scoring_param_type, :parameter_normalizers ]
47
52
  }
48
53
  end
49
54
  end
@@ -1,11 +1,12 @@
1
1
  module Dscf::Credit
2
2
  class SystemConfigsController < ApplicationController
3
3
  include Dscf::Core::Common
4
+ include Dscf::Credit::Reviewable
4
5
 
5
6
  def create
6
7
  super do
7
8
  obj = @clazz.new(model_params)
8
- obj.approved_by = current_user
9
+ obj.reviewed_by = current_user
9
10
  obj.last_updated_by = current_user
10
11
  obj
11
12
  end
@@ -25,24 +26,26 @@ module Dscf::Credit
25
26
  params.require(:system_config).permit(
26
27
  :config_definition_id,
27
28
  :config_value,
28
- :status
29
+ :status,
30
+ :review_date,
31
+ :review_feedback
29
32
  )
30
33
  end
31
34
 
32
35
  def eager_loaded_associations
33
- [ :config_definition, :last_updated_by, :approved_by ]
36
+ [ :config_definition, :last_updated_by, :reviewed_by ]
34
37
  end
35
38
 
36
39
  def allowed_order_columns
37
- %w[id config_value status created_at updated_at]
40
+ %w[id config_value status review_date created_at updated_at]
38
41
  end
39
42
 
40
43
  def default_serializer_includes
41
44
  {
42
45
  index: [ :config_definition ],
43
- show: [ :config_definition, :last_updated_by, :approved_by ],
44
- create: [ :config_definition, :last_updated_by, :approved_by ],
45
- update: [ :config_definition, :last_updated_by, :approved_by ]
46
+ show: [ :config_definition, :last_updated_by, :reviewed_by ],
47
+ create: [ :config_definition, :last_updated_by, :reviewed_by ],
48
+ update: [ :config_definition, :last_updated_by, :reviewed_by ]
46
49
  }
47
50
  end
48
51
  end
@@ -11,7 +11,7 @@ module Dscf::Credit
11
11
  scope :by_type, ->(category_type) { where(type: category_type) }
12
12
 
13
13
  def self.ransackable_attributes(auth_object = nil)
14
- %w[id type name description created_at updated_at]
14
+ %w[id type name description document_reference created_at updated_at]
15
15
  end
16
16
 
17
17
  def self.ransackable_associations(auth_object = nil)
@@ -5,7 +5,8 @@ module Dscf::Credit
5
5
  belongs_to :bank, class_name: "Dscf::Credit::Bank", foreign_key: "bank_id"
6
6
  belongs_to :category, class_name: "Dscf::Credit::Category", foreign_key: "category_id"
7
7
  belongs_to :created_by, polymorphic: true
8
- belongs_to :approved_by, polymorphic: true, optional: true
8
+ belongs_to :reviewed_by, polymorphic: true, optional: true
9
+
9
10
  has_many :credit_line_specs, class_name: "Dscf::Credit::CreditLineSpec", foreign_key: "credit_line_id", dependent: :destroy
10
11
  has_many :loans, class_name: "Dscf::Credit::Loan", foreign_key: "credit_line_id", dependent: :destroy
11
12
  has_many :scoring_tables, class_name: "Dscf::Credit::ScoringTable", foreign_key: "credit_line_id", dependent: :destroy
@@ -13,18 +14,20 @@ module Dscf::Credit
13
14
 
14
15
  validates :name, presence: true
15
16
  validates :code, uniqueness: { scope: :bank_id }, allow_blank: true
16
- validates :status, inclusion: { in: %w[pending approved active suspended] }
17
+ validates :status, inclusion: { in: %w[pending approved active suspended rejected modify] }
18
+ enum :status, { pending: "pending", approved: "approved", rejected: "rejected", modify: "modify", active: "active", suspended: "suspended" }
19
+
17
20
 
18
21
  scope :active, -> { where(status: "active") }
19
22
  scope :approved, -> { where(status: "approved") }
20
23
  scope :pending, -> { where(status: "pending") }
21
24
 
22
25
  def self.ransackable_attributes(auth_object = nil)
23
- %w[id name code description status approval_date created_at updated_at]
26
+ %w[id name code description status review_date review_feedback document_reference created_at updated_at]
24
27
  end
25
28
 
26
29
  def self.ransackable_associations(auth_object = nil)
27
- %w[bank category created_by approved_by credit_line_specs loans scoring_tables scoring_parameters]
30
+ %w[bank category created_by reviewed_by credit_line_specs loans scoring_tables scoring_parameters]
28
31
  end
29
32
  end
30
33
  end