dscf-credit 0.1.0 → 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.
- checksums.yaml +4 -4
- data/app/controllers/concerns/dscf/credit/reviewable.rb +112 -0
- data/app/controllers/dscf/credit/categories_controller.rb +3 -2
- data/app/controllers/dscf/credit/credit_lines_controller.rb +11 -38
- data/app/controllers/dscf/credit/facilitators_controller.rb +41 -152
- data/app/controllers/dscf/credit/scoring_param_types_controller.rb +31 -0
- data/app/controllers/dscf/credit/scoring_parameters_controller.rb +13 -8
- data/app/controllers/dscf/credit/system_configs_controller.rb +10 -7
- data/app/models/dscf/credit/category.rb +1 -1
- data/app/models/dscf/credit/credit_line.rb +7 -4
- data/app/models/dscf/credit/facilitator.rb +5 -4
- data/app/models/dscf/credit/facilitator_performance.rb +1 -2
- data/app/models/dscf/credit/loan_profile.rb +4 -3
- data/app/models/dscf/credit/loan_profile_scoring_spec.rb +3 -4
- data/app/models/dscf/credit/scoring_param_type.rb +17 -0
- data/app/models/dscf/credit/scoring_parameter.rb +7 -6
- data/app/models/dscf/credit/system_config.rb +5 -4
- data/app/serializers/dscf/credit/category_serializer.rb +1 -1
- data/app/serializers/dscf/credit/credit_line_serializer.rb +2 -2
- data/app/serializers/dscf/credit/facilitator_performance_serializer.rb +10 -0
- data/app/serializers/dscf/credit/facilitator_serializer.rb +11 -0
- data/app/serializers/dscf/credit/scoring_param_type_serializer.rb +7 -0
- data/app/serializers/dscf/credit/scoring_parameter_serializer.rb +4 -3
- data/app/serializers/dscf/credit/system_config_serializer.rb +2 -2
- data/app/services/dscf/credit/facilitator_additional_info_service.rb +1 -13
- data/app/services/dscf/credit/facilitator_approval_service.rb +4 -3
- data/app/services/dscf/credit/facilitator_creation_service.rb +157 -0
- data/config/locales/en.yml +46 -8
- data/config/routes.rb +23 -6
- data/db/migrate/20250822091011_create_dscf_credit_categories.rb +2 -0
- data/db/migrate/20250822091131_create_dscf_credit_credit_lines.rb +7 -4
- data/db/migrate/20250822091820_create_dscf_credit_system_configs.rb +5 -2
- data/db/migrate/20250822092040_create_dscf_credit_scoring_param_types.rb +12 -0
- data/db/migrate/20250822092050_create_dscf_credit_scoring_parameters.rb +11 -6
- data/db/migrate/20250822092246_create_dscf_credit_loan_profiles.rb +5 -3
- data/db/migrate/20250822092417_create_dscf_credit_loan_profile_scoring_specs.rb +5 -4
- data/db/migrate/20250822092436_create_dscf_credit_facilitators.rb +5 -2
- data/db/migrate/20250822092528_create_dscf_credit_facilitator_performances.rb +0 -3
- data/db/seeds.rb +48 -20
- data/lib/dscf/credit/version.rb +1 -1
- data/spec/factories/dscf/credit/categories.rb +1 -0
- data/spec/factories/dscf/credit/credit_lines.rb +7 -5
- data/spec/factories/dscf/credit/facilitator_performances.rb +0 -5
- data/spec/factories/dscf/credit/facilitators.rb +6 -1
- data/spec/factories/dscf/credit/loan_profile_scoring_specs.rb +3 -6
- data/spec/factories/dscf/credit/loan_profiles.rb +10 -6
- data/spec/factories/dscf/credit/scoring_param_types.rb +31 -0
- data/spec/factories/dscf/credit/scoring_parameters.rb +26 -4
- data/spec/factories/dscf/credit/system_configs.rb +8 -2
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 226454dfdada01577236a828d48ac886241ba1ca0681cf2ba6ea5f56958d0288
|
4
|
+
data.tar.gz: 4d5855466e0a7e5e9d7e7a9f861500b0ca46dd6a77ab0181de340fc226f646c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
:
|
54
|
-
:
|
55
|
-
:
|
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, :
|
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
|
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, :
|
71
|
-
create: [ :bank, :category, :created_by, :
|
72
|
-
update: [ :bank, :category, :created_by, :
|
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
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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,153 +17,62 @@ module Dscf::Credit
|
|
39
17
|
def approve
|
40
18
|
begin
|
41
19
|
FacilitatorApprovalService.new(@facilitator, current_user).approve(params[:total_limit])
|
42
|
-
render_success(
|
20
|
+
render_success(data: @facilitator)
|
43
21
|
rescue StandardError => e
|
44
|
-
render_error(
|
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[:
|
51
|
-
render_success(
|
28
|
+
FacilitatorApprovalService.new(@facilitator, current_user).reject(params[:review_feedback])
|
29
|
+
render_success(data: @facilitator)
|
52
30
|
rescue StandardError => e
|
53
|
-
render_error(
|
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(
|
38
|
+
render_success(data: @facilitator)
|
61
39
|
rescue StandardError => e
|
62
|
-
render_error(
|
40
|
+
render_error(errors: e.message)
|
63
41
|
end
|
64
42
|
end
|
65
43
|
|
66
44
|
def submit_additional_info
|
67
|
-
|
45
|
+
facilitator_id = params[:id] || params[:facilitator_id]
|
68
46
|
additional_info = params[:additional_info]&.permit!.to_h
|
69
47
|
|
70
48
|
begin
|
71
|
-
result = FacilitatorAdditionalInfoService.new.submit_info(
|
72
|
-
render_success(
|
49
|
+
result = FacilitatorAdditionalInfoService.new.submit_info(facilitator_id, additional_info)
|
50
|
+
render_success(data: result)
|
73
51
|
rescue StandardError => e
|
74
|
-
render_error(
|
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
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
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
|
-
|
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
|
-
:
|
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, :
|
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, :
|
219
|
-
create: [ :user, :bank, :
|
220
|
-
update: [ :user, :bank, :
|
221
|
-
approve: [ :user, :bank, :
|
222
|
-
reject: [ :user, :bank, :
|
223
|
-
set_limit: [ :user, :bank, :
|
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.
|
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
|
-
:
|
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, :
|
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
|
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, :
|
45
|
-
create: [ :bank, :created_by, :
|
46
|
-
update: [ :bank, :created_by, :
|
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.
|
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, :
|
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, :
|
44
|
-
create: [ :config_definition, :last_updated_by, :
|
45
|
-
update: [ :config_definition, :last_updated_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 :
|
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
|
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
|
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
|