dscf-credit 0.1.4 → 0.1.5

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/dscf/core/copilot-instructions.md +683 -0
  3. data/app/controllers/concerns/dscf/core/reviewable_controller.rb +347 -0
  4. data/app/controllers/dscf/credit/categories_controller.rb +3 -3
  5. data/app/controllers/dscf/credit/credit_lines_controller.rb +21 -13
  6. data/app/controllers/dscf/credit/eligible_credit_lines_controller.rb +50 -8
  7. data/app/controllers/dscf/credit/facilitator_applications_controller.rb +35 -0
  8. data/app/controllers/dscf/credit/facilitators_controller.rb +8 -96
  9. data/app/controllers/dscf/credit/loan_applications_controller.rb +252 -0
  10. data/app/controllers/dscf/credit/loan_profiles_controller.rb +61 -68
  11. data/app/controllers/dscf/credit/payment_requests_controller.rb +3 -5
  12. data/app/controllers/dscf/credit/scoring_parameters_controller.rb +59 -13
  13. data/app/controllers/dscf/credit/system_configs_controller.rb +30 -12
  14. data/app/models/concerns/core/reviewable_model.rb +31 -0
  15. data/app/models/dscf/credit/bank.rb +3 -3
  16. data/app/models/dscf/credit/bank_branch.rb +1 -1
  17. data/app/models/dscf/credit/category.rb +1 -2
  18. data/app/models/dscf/credit/credit_line.rb +4 -10
  19. data/app/models/dscf/credit/eligible_credit_line.rb +2 -2
  20. data/app/models/dscf/credit/facilitator.rb +6 -17
  21. data/app/models/dscf/credit/facilitator_application.rb +20 -0
  22. data/app/models/dscf/credit/loan_application.rb +30 -0
  23. data/app/models/dscf/credit/loan_profile.rb +10 -30
  24. data/app/models/dscf/credit/parameter_normalizer.rb +1 -1
  25. data/app/models/dscf/credit/scoring_parameter.rb +5 -7
  26. data/app/models/dscf/credit/system_config.rb +4 -9
  27. data/app/serializers/dscf/credit/category_serializer.rb +0 -1
  28. data/app/serializers/dscf/credit/credit_line_serializer.rb +2 -2
  29. data/app/serializers/dscf/credit/facilitator_application_serializer.rb +7 -0
  30. data/app/serializers/dscf/credit/facilitator_serializer.rb +3 -6
  31. data/app/serializers/dscf/credit/loan_application_serializer.rb +12 -0
  32. data/app/serializers/dscf/credit/loan_profile_serializer.rb +3 -6
  33. data/app/serializers/dscf/credit/scoring_parameter_serializer.rb +3 -4
  34. data/app/serializers/dscf/credit/system_config_serializer.rb +2 -2
  35. data/app/services/dscf/credit/credit_scoring_engine.rb +258 -0
  36. data/app/services/dscf/credit/facility_limit_calculation_engine.rb +159 -0
  37. data/app/services/dscf/credit/loan_profile_creation_service.rb +91 -0
  38. data/app/services/dscf/credit/risk_application_service.rb +61 -11
  39. data/config/locales/en.yml +63 -48
  40. data/config/routes.rb +31 -17
  41. data/db/migrate/20250822091131_create_dscf_credit_credit_lines.rb +1 -8
  42. data/db/migrate/20250822091820_create_dscf_credit_system_configs.rb +0 -7
  43. data/db/migrate/20250822092050_create_dscf_credit_scoring_parameters.rb +2 -6
  44. data/db/migrate/20250822092225_create_dscf_credit_parameter_normalizers.rb +1 -1
  45. data/db/migrate/20250822092236_create_dscf_credit_loan_applications.rb +20 -0
  46. data/db/migrate/20250822092246_create_dscf_credit_loan_profiles.rb +7 -19
  47. data/db/migrate/20250822092426_create_dscf_credit_facilitator_applications.rb +10 -0
  48. data/db/migrate/20250822092436_create_dscf_credit_facilitators.rb +1 -16
  49. data/db/seeds.rb +316 -203
  50. data/lib/dscf/credit/version.rb +1 -1
  51. data/spec/factories/dscf/credit/banks.rb +1 -1
  52. data/spec/factories/dscf/credit/credit_lines.rb +0 -23
  53. data/spec/factories/dscf/credit/facilitator_applications.rb +37 -0
  54. data/spec/factories/dscf/credit/facilitators.rb +8 -30
  55. data/spec/factories/dscf/credit/loan_applications.rb +42 -0
  56. data/spec/factories/dscf/credit/loan_profiles.rb +20 -34
  57. data/spec/factories/dscf/credit/parameter_normalizers.rb +4 -4
  58. data/spec/factories/dscf/credit/scoring_parameters.rb +14 -11
  59. data/spec/factories/dscf/credit/system_configs.rb +21 -5
  60. metadata +20 -10
  61. data/app/controllers/concerns/dscf/credit/reviewable.rb +0 -112
  62. data/app/controllers/dscf/credit/scoring_tables_controller.rb +0 -63
  63. data/app/models/dscf/credit/scoring_table.rb +0 -24
  64. data/app/serializers/dscf/credit/scoring_table_serializer.rb +0 -9
  65. data/db/migrate/20250901172842_create_dscf_credit_scoring_tables.rb +0 -18
  66. data/spec/factories/dscf/credit/scoring_tables.rb +0 -25
@@ -1,63 +0,0 @@
1
- module Dscf::Credit
2
- class ScoringTablesController < ApplicationController
3
- include Dscf::Core::Common
4
-
5
- def create
6
- super do
7
- scoring_table = @clazz.new(model_params)
8
- scoring_table.created_by = current_user
9
- scoring_table
10
- end
11
- end
12
-
13
- def activate
14
- @obj = @clazz.find(params[:id])
15
- if @obj.update(active: true)
16
- render_success(data: @obj, serializer_options: { include: [ :category, :scoring_parameter, :created_by ] })
17
- else
18
- render_error(errors: @obj.errors.full_messages[0], status: :unprocessable_entity)
19
- end
20
- rescue StandardError => e
21
- render_error(error: e.message)
22
- end
23
-
24
- def deactivate
25
- @obj = @clazz.find(params[:id])
26
- if @obj.update(active: false)
27
- render_success(data: @obj, serializer_options: { include: [ :category, :scoring_parameter, :created_by ] })
28
- else
29
- render_error(errors: @obj.errors.full_messages[0], status: :unprocessable_entity)
30
- end
31
- rescue StandardError => e
32
- render_error(error: e.message)
33
- end
34
-
35
- private
36
-
37
- def model_params
38
- params.require(:scoring_table).permit(
39
- :category_id,
40
- :scoring_parameter_id,
41
- :weight,
42
- :active
43
- )
44
- end
45
-
46
- def eager_loaded_associations
47
- [ :category, :scoring_parameter, :created_by ]
48
- end
49
-
50
- def allowed_order_columns
51
- %w[id weight active created_at updated_at]
52
- end
53
-
54
- def default_serializer_includes
55
- {
56
- index: [ :category, :scoring_parameter, :created_by ],
57
- show: [ :category, :scoring_parameter, :created_by ],
58
- create: [ :category, :scoring_parameter, :created_by ],
59
- update: [ :category, :scoring_parameter, :created_by ]
60
- }
61
- end
62
- end
63
- end
@@ -1,24 +0,0 @@
1
- module Dscf::Credit
2
- class ScoringTable < ApplicationRecord
3
- self.table_name = "dscf_credit_scoring_tables"
4
-
5
- belongs_to :category, class_name: "Dscf::Credit::Category", foreign_key: "category_id"
6
- belongs_to :scoring_parameter, class_name: "Dscf::Credit::ScoringParameter", foreign_key: "scoring_parameter_id"
7
- belongs_to :created_by, polymorphic: true
8
-
9
- validates :weight, presence: true, numericality: { greater_than: 0, less_than_or_equal_to: 1 }
10
- validates :category_id, uniqueness: { scope: :scoring_parameter_id }
11
-
12
- scope :active, -> { where(active: true) }
13
- scope :by_category, ->(category_id) { where(category_id: category_id) }
14
- scope :by_scoring_parameter, ->(scoring_parameter_id) { where(scoring_parameter_id: scoring_parameter_id) }
15
-
16
- def self.ransackable_attributes(auth_object = nil)
17
- %w[id weight active created_at updated_at]
18
- end
19
-
20
- def self.ransackable_associations(auth_object = nil)
21
- %w[category scoring_parameter created_by]
22
- end
23
- end
24
- end
@@ -1,9 +0,0 @@
1
- module Dscf::Credit
2
- class ScoringTableSerializer < ActiveModel::Serializer
3
- attributes :id, :weight, :active, :created_at, :updated_at
4
-
5
- belongs_to :category, serializer: Dscf::Credit::CategorySerializer
6
- belongs_to :scoring_parameter, serializer: Dscf::Credit::ScoringParameterSerializer
7
- belongs_to :created_by, serializer: Dscf::Core::UserSerializer
8
- end
9
- end
@@ -1,18 +0,0 @@
1
- class CreateDscfCreditScoringTables < ActiveRecord::Migration[8.0]
2
- def change
3
- create_table :dscf_credit_scoring_tables do |t|
4
- t.references :category, null: false, foreign_key: { to_table: :dscf_credit_categories }
5
- t.references :scoring_parameter, null: false, foreign_key: { to_table: :dscf_credit_scoring_parameters }
6
- t.decimal :weight, precision: 5, scale: 4, null: false
7
- t.boolean :active, default: true
8
- t.references :created_by, polymorphic: true, null: false
9
-
10
- t.timestamps
11
- end
12
-
13
- add_index :dscf_credit_scoring_tables, :weight
14
- add_index :dscf_credit_scoring_tables, :active
15
- add_index :dscf_credit_scoring_tables, [ :created_by_type, :created_by_id ]
16
- add_index :dscf_credit_scoring_tables, [ :category_id, :scoring_parameter_id ], unique: true, name: 'index_scoring_tables_on_category_and_scoring_parameter'
17
- end
18
- end
@@ -1,25 +0,0 @@
1
- FactoryBot.define do
2
- factory :scoring_table, class: "Dscf::Credit::ScoringTable" do
3
- association :category, factory: :category
4
- association :scoring_parameter, factory: :scoring_parameter
5
- association :created_by, factory: :user if defined?(Dscf::Core::User)
6
- weight { Faker::Number.decimal(l_digits: 0, r_digits: 4).clamp(0.0001, 1.0) }
7
- active { true }
8
-
9
- trait :inactive do
10
- active { false }
11
- end
12
-
13
- trait :high_weight do
14
- weight { Faker::Number.decimal(l_digits: 0, r_digits: 4).clamp(0.7, 1.0) }
15
- end
16
-
17
- trait :medium_weight do
18
- weight { Faker::Number.decimal(l_digits: 0, r_digits: 4).clamp(0.3, 0.7) }
19
- end
20
-
21
- trait :low_weight do
22
- weight { Faker::Number.decimal(l_digits: 0, r_digits: 4).clamp(0.0001, 0.3) }
23
- end
24
- end
25
- end