dscf-credit 0.1.0

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 (135) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +8 -0
  5. data/app/controllers/dscf/credit/application_controller.rb +8 -0
  6. data/app/controllers/dscf/credit/bank_branches_controller.rb +38 -0
  7. data/app/controllers/dscf/credit/bank_staffs_controller.rb +77 -0
  8. data/app/controllers/dscf/credit/banks_controller.rb +39 -0
  9. data/app/controllers/dscf/credit/categories_controller.rb +32 -0
  10. data/app/controllers/dscf/credit/credit_line_specs_controller.rb +72 -0
  11. data/app/controllers/dscf/credit/credit_lines_controller.rb +76 -0
  12. data/app/controllers/dscf/credit/facilitators_controller.rb +227 -0
  13. data/app/controllers/dscf/credit/loans_controller.rb +41 -0
  14. data/app/controllers/dscf/credit/parameter_normalizers_controller.rb +31 -0
  15. data/app/controllers/dscf/credit/payment_requests_controller.rb +38 -0
  16. data/app/controllers/dscf/credit/payments_controller.rb +36 -0
  17. data/app/controllers/dscf/credit/scoring_parameters_controller.rb +50 -0
  18. data/app/controllers/dscf/credit/scoring_tables_controller.rb +63 -0
  19. data/app/controllers/dscf/credit/system_config_definitions_controller.rb +34 -0
  20. data/app/controllers/dscf/credit/system_configs_controller.rb +49 -0
  21. data/app/controllers/dscf/credit/users_controller.rb +53 -0
  22. data/app/jobs/dscf/credit/application_job.rb +6 -0
  23. data/app/mailers/dscf/credit/application_mailer.rb +8 -0
  24. data/app/mailers/dscf/credit/bank_staff_welcome_mailer.rb +15 -0
  25. data/app/mailers/dscf/credit/facilitator_mailer.rb +54 -0
  26. data/app/models/dscf/credit/accounting_audit_request.rb +17 -0
  27. data/app/models/dscf/credit/accounting_entry.rb +15 -0
  28. data/app/models/dscf/credit/application_record.rb +7 -0
  29. data/app/models/dscf/credit/bank.rb +38 -0
  30. data/app/models/dscf/credit/bank_branch.rb +23 -0
  31. data/app/models/dscf/credit/bank_staff.rb +26 -0
  32. data/app/models/dscf/credit/category.rb +21 -0
  33. data/app/models/dscf/credit/credit_line.rb +30 -0
  34. data/app/models/dscf/credit/credit_line_spec.rb +37 -0
  35. data/app/models/dscf/credit/daily_routine_transaction.rb +18 -0
  36. data/app/models/dscf/credit/facilitator.rb +31 -0
  37. data/app/models/dscf/credit/facilitator_performance.rb +17 -0
  38. data/app/models/dscf/credit/failed_operations_log.rb +17 -0
  39. data/app/models/dscf/credit/loan.rb +33 -0
  40. data/app/models/dscf/credit/loan_profile.rb +43 -0
  41. data/app/models/dscf/credit/loan_profile_scoring_spec.rb +23 -0
  42. data/app/models/dscf/credit/loan_transaction.rb +17 -0
  43. data/app/models/dscf/credit/parameter_normalizer.rb +11 -0
  44. data/app/models/dscf/credit/payment.rb +22 -0
  45. data/app/models/dscf/credit/payment_request.rb +29 -0
  46. data/app/models/dscf/credit/scoring_parameter.rb +30 -0
  47. data/app/models/dscf/credit/scoring_table.rb +24 -0
  48. data/app/models/dscf/credit/system_config.rb +25 -0
  49. data/app/models/dscf/credit/system_config_definition.rb +25 -0
  50. data/app/serializers/dscf/core/business_serializer.rb +9 -0
  51. data/app/serializers/dscf/core/business_type_serializer.rb +7 -0
  52. data/app/serializers/dscf/core/role_serializer.rb +7 -0
  53. data/app/serializers/dscf/core/user_profile_serializer.rb +13 -0
  54. data/app/serializers/dscf/core/user_role_serializer.rb +16 -0
  55. data/app/serializers/dscf/core/user_serializer.rb +17 -0
  56. data/app/serializers/dscf/credit/bank_branch_serializer.rb +9 -0
  57. data/app/serializers/dscf/credit/bank_serializer.rb +9 -0
  58. data/app/serializers/dscf/credit/bank_staff_serializer.rb +8 -0
  59. data/app/serializers/dscf/credit/category_serializer.rb +7 -0
  60. data/app/serializers/dscf/credit/credit_line_serializer.rb +12 -0
  61. data/app/serializers/dscf/credit/credit_line_spec_serializer.rb +12 -0
  62. data/app/serializers/dscf/credit/parameter_normalizer_serializer.rb +8 -0
  63. data/app/serializers/dscf/credit/scoring_parameter_serializer.rb +12 -0
  64. data/app/serializers/dscf/credit/scoring_table_serializer.rb +9 -0
  65. data/app/serializers/dscf/credit/system_config_definition_serializer.rb +9 -0
  66. data/app/serializers/dscf/credit/system_config_serializer.rb +18 -0
  67. data/app/services/dscf/credit/bank_staff_creation_service.rb +99 -0
  68. data/app/services/dscf/credit/facilitator_additional_info_service.rb +62 -0
  69. data/app/services/dscf/credit/facilitator_approval_service.rb +88 -0
  70. data/app/views/dscf/credit/bank_staff_welcome_mailer/welcome_email.html.erb +116 -0
  71. data/app/views/dscf/credit/bank_staff_welcome_mailer/welcome_email.text.erb +40 -0
  72. data/app/views/dscf/credit/facilitator_mailer/additional_info_received.html.erb +39 -0
  73. data/app/views/dscf/credit/facilitator_mailer/additional_info_received.text.erb +17 -0
  74. data/app/views/dscf/credit/facilitator_mailer/approval_notification.html.erb +59 -0
  75. data/app/views/dscf/credit/facilitator_mailer/approval_notification.text.erb +26 -0
  76. data/app/views/dscf/credit/facilitator_mailer/limit_update_notification.html.erb +39 -0
  77. data/app/views/dscf/credit/facilitator_mailer/limit_update_notification.text.erb +17 -0
  78. data/app/views/dscf/credit/facilitator_mailer/rejection_notification.html.erb +41 -0
  79. data/app/views/dscf/credit/facilitator_mailer/rejection_notification.text.erb +19 -0
  80. data/app/views/layouts/mailer.html.erb +125 -0
  81. data/app/views/layouts/mailer.text.erb +12 -0
  82. data/config/locales/en.yml +208 -0
  83. data/config/routes.rb +50 -0
  84. data/db/migrate/20250822091011_create_dscf_credit_categories.rb +15 -0
  85. data/db/migrate/20250822091015_create_dscf_credit_banks.rb +23 -0
  86. data/db/migrate/20250822091055_create_dscf_credit_bank_branches.rb +23 -0
  87. data/db/migrate/20250822091131_create_dscf_credit_credit_lines.rb +25 -0
  88. data/db/migrate/20250822091527_create_dscf_credit_credit_line_specs.rb +32 -0
  89. data/db/migrate/20250822091744_create_dscf_credit_system_config_definitions.rb +18 -0
  90. data/db/migrate/20250822091820_create_dscf_credit_system_configs.rb +17 -0
  91. data/db/migrate/20250822092050_create_dscf_credit_scoring_parameters.rb +30 -0
  92. data/db/migrate/20250822092225_create_dscf_credit_parameter_normalizers.rb +18 -0
  93. data/db/migrate/20250822092246_create_dscf_credit_loan_profiles.rb +25 -0
  94. data/db/migrate/20250822092417_create_dscf_credit_loan_profile_scoring_specs.rb +23 -0
  95. data/db/migrate/20250822092436_create_dscf_credit_facilitators.rb +22 -0
  96. data/db/migrate/20250822092528_create_dscf_credit_facilitator_performances.rb +26 -0
  97. data/db/migrate/20250822092608_create_dscf_credit_payment_requests.rb +26 -0
  98. data/db/migrate/20250822092654_create_dscf_credit_loans.rb +29 -0
  99. data/db/migrate/20250822092717_create_dscf_credit_loan_transactions.rb +21 -0
  100. data/db/migrate/20250822092738_create_dscf_credit_daily_routine_transactions.rb +23 -0
  101. data/db/migrate/20250822092819_create_dscf_credit_accounting_audit_requests.rb +20 -0
  102. data/db/migrate/20250822092843_create_dscf_credit_payments.rb +23 -0
  103. data/db/migrate/20250822092908_create_dscf_credit_failed_operations_logs.rb +21 -0
  104. data/db/migrate/20250822092936_create_dscf_credit_accounting_entries.rb +21 -0
  105. data/db/migrate/20250825231109_create_dscf_credit_bank_staff.rb +14 -0
  106. data/db/migrate/20250901172842_create_dscf_credit_scoring_tables.rb +18 -0
  107. data/db/seeds.rb +745 -0
  108. data/lib/dscf/credit/engine.rb +28 -0
  109. data/lib/dscf/credit/version.rb +5 -0
  110. data/lib/dscf/credit.rb +9 -0
  111. data/lib/tasks/dscf/credit_tasks.rake +4 -0
  112. data/spec/factories/dscf/credit/accounting_audit_requests.rb +58 -0
  113. data/spec/factories/dscf/credit/accounting_entries.rb +29 -0
  114. data/spec/factories/dscf/credit/bank_branches.rb +21 -0
  115. data/spec/factories/dscf/credit/bank_staffs.rb +19 -0
  116. data/spec/factories/dscf/credit/banks.rb +30 -0
  117. data/spec/factories/dscf/credit/categories.rb +27 -0
  118. data/spec/factories/dscf/credit/credit_line_specs.rb +57 -0
  119. data/spec/factories/dscf/credit/credit_lines.rb +32 -0
  120. data/spec/factories/dscf/credit/daily_routine_transactions.rb +36 -0
  121. data/spec/factories/dscf/credit/facilitator_performances.rb +30 -0
  122. data/spec/factories/dscf/credit/facilitators.rb +35 -0
  123. data/spec/factories/dscf/credit/failed_operations_logs.rb +34 -0
  124. data/spec/factories/dscf/credit/loan_profile_scoring_specs.rb +31 -0
  125. data/spec/factories/dscf/credit/loan_profiles.rb +49 -0
  126. data/spec/factories/dscf/credit/loan_transactions.rb +37 -0
  127. data/spec/factories/dscf/credit/loans.rb +37 -0
  128. data/spec/factories/dscf/credit/parameter_normalizers.rb +24 -0
  129. data/spec/factories/dscf/credit/payment_requests.rb +40 -0
  130. data/spec/factories/dscf/credit/payments.rb +39 -0
  131. data/spec/factories/dscf/credit/scoring_parameters.rb +48 -0
  132. data/spec/factories/dscf/credit/scoring_tables.rb +25 -0
  133. data/spec/factories/dscf/credit/system_config_definitions.rb +45 -0
  134. data/spec/factories/dscf/credit/system_configs.rb +29 -0
  135. metadata +456 -0
@@ -0,0 +1,40 @@
1
+ FactoryBot.define do
2
+ factory :payment_request, class: "Dscf::Credit::PaymentRequest" do
3
+ association :user, factory: :user if defined?(Dscf::Core::User)
4
+ order_id { Faker::Alphanumeric.alphanumeric(number: 16).upcase }
5
+ request_type { %w[loan_disbursement loan_repayment interest_payment fee_payment].sample }
6
+ amount { Faker::Number.decimal(l_digits: 5, r_digits: 2) }
7
+ receiver_account_reference { Faker::Bank.account_number }
8
+ status { %w[pending approved rejected processed failed].sample }
9
+ failure_reason { Faker::Lorem.sentence if status.in?(%w[rejected failed]) }
10
+ initiated_at { Faker::Time.between(from: 1.month.ago, to: Time.current) }
11
+ approved_at { initiated_at + rand(1..24).hours if status.in?(%w[approved processed]) }
12
+
13
+ trait :pending do
14
+ status { "pending" }
15
+ approved_at { nil }
16
+ failure_reason { nil }
17
+ end
18
+
19
+ trait :approved do
20
+ status { "approved" }
21
+ approved_at { initiated_at + rand(1..24).hours }
22
+ failure_reason { nil }
23
+ end
24
+
25
+ trait :rejected do
26
+ status { "rejected" }
27
+ failure_reason { Faker::Lorem.sentence }
28
+ end
29
+
30
+ trait :processed do
31
+ status { "processed" }
32
+ approved_at { initiated_at + rand(1..24).hours }
33
+ end
34
+
35
+ trait :failed do
36
+ status { "failed" }
37
+ failure_reason { Faker::Lorem.sentence }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ FactoryBot.define do
2
+ factory :payment, class: "Dscf::Credit::Payment" do
3
+ association :payment_request, factory: :payment_request
4
+ amount { Faker::Number.decimal(l_digits: 5, r_digits: 2) }
5
+ receiver_account_reference { Faker::Alphanumeric.alphanumeric(number: 20) }
6
+ transaction_reference { Faker::Alphanumeric.alphanumeric(number: 16) }
7
+ status { %w[pending processing completed failed cancelled].sample }
8
+ failure_reason { Faker::Lorem.sentence if status.in?(%w[failed cancelled]) }
9
+ processed_at { Faker::Time.between(from: 1.month.ago, to: Time.current) if status.in?(%w[completed failed]) }
10
+
11
+ trait :pending do
12
+ status { "pending" }
13
+ processed_at { nil }
14
+ failure_reason { nil }
15
+ end
16
+
17
+ trait :processing do
18
+ status { "processing" }
19
+ processed_at { nil }
20
+ end
21
+
22
+ trait :completed do
23
+ status { "completed" }
24
+ processed_at { Faker::Time.between(from: 1.month.ago, to: Time.current) }
25
+ failure_reason { nil }
26
+ end
27
+
28
+ trait :failed do
29
+ status { "failed" }
30
+ processed_at { Faker::Time.between(from: 1.month.ago, to: Time.current) }
31
+ failure_reason { Faker::Lorem.sentence }
32
+ end
33
+
34
+ trait :cancelled do
35
+ status { "cancelled" }
36
+ failure_reason { Faker::Lorem.sentence }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,48 @@
1
+ FactoryBot.define do
2
+ factory :scoring_parameter, class: "Dscf::Credit::ScoringParameter" do
3
+ association :bank, factory: :bank
4
+ association :created_by, factory: :user if defined?(Dscf::Core::User)
5
+ association :approved_by, factory: :user if defined?(Dscf::Core::User)
6
+ name { Faker::Lorem.words(number: 2).join('_').downcase }
7
+ description { Faker::Lorem.paragraph }
8
+ data_type { %w[integer decimal boolean string].sample }
9
+ type { %w[income credit_history employment_status collateral].sample }
10
+ weight { Faker::Number.decimal(l_digits: 0, r_digits: 4) }
11
+ min_value { Faker::Number.decimal(l_digits: 2, r_digits: 2) }
12
+ max_value { min_value + Faker::Number.decimal(l_digits: 3, r_digits: 2) }
13
+ active { true }
14
+ expires_at { Faker::Date.between(from: 6.months.from_now, to: 2.years.from_now) }
15
+
16
+ trait :active do
17
+ active { true }
18
+ end
19
+
20
+ trait :inactive do
21
+ active { false }
22
+ end
23
+
24
+ trait :with_previous_version do
25
+ association :previous_version, factory: :scoring_parameter
26
+ end
27
+
28
+ trait :integer_type do
29
+ data_type { "integer" }
30
+ end
31
+
32
+ trait :decimal_type do
33
+ data_type { "decimal" }
34
+ end
35
+
36
+ trait :boolean_type do
37
+ data_type { "boolean" }
38
+ min_value { 0 }
39
+ max_value { 1 }
40
+ end
41
+
42
+ trait :string_type do
43
+ data_type { "string" }
44
+ min_value { nil }
45
+ max_value { nil }
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,25 @@
1
+ FactoryBot.define do
2
+ factory :scoring_table, class: "Dscf::Credit::ScoringTable" do
3
+ association :credit_line, factory: :credit_line
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
@@ -0,0 +1,45 @@
1
+ FactoryBot.define do
2
+ factory :system_config_definition, class: "Dscf::Credit::SystemConfigDefinition" do
3
+ association :bank, factory: :bank
4
+ config_key { Faker::Lorem.words(number: 2).join('_').downcase }
5
+ description { Faker::Lorem.paragraph }
6
+ value_type { %w[string integer decimal boolean json].sample }
7
+ frequency { %w[once daily weekly monthly quarterly yearly].sample }
8
+
9
+ trait :string_type do
10
+ value_type { "string" }
11
+ end
12
+
13
+ trait :integer_type do
14
+ value_type { "integer" }
15
+ end
16
+
17
+ trait :decimal_type do
18
+ value_type { "decimal" }
19
+ end
20
+
21
+ trait :boolean_type do
22
+ value_type { "boolean" }
23
+ end
24
+
25
+ trait :json_type do
26
+ value_type { "json" }
27
+ end
28
+
29
+ trait :daily_frequency do
30
+ frequency { "daily" }
31
+ end
32
+
33
+ trait :monthly_frequency do
34
+ frequency { "monthly" }
35
+ end
36
+
37
+ trait :yearly_frequency do
38
+ frequency { "yearly" }
39
+ end
40
+
41
+ trait :no_frequency do
42
+ frequency { nil }
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,29 @@
1
+ FactoryBot.define do
2
+ factory :system_config, class: "Dscf::Credit::SystemConfig" do
3
+ association :config_definition, factory: :system_config_definition
4
+ association :last_updated_by, factory: :user if defined?(Dscf::Core::User)
5
+ association :approved_by, factory: :user if defined?(Dscf::Core::User)
6
+ config_value { Faker::Lorem.word }
7
+ status { %w[pending approved rejected].sample }
8
+
9
+ trait :string_value do
10
+ config_value { Faker::Lorem.sentence }
11
+ end
12
+
13
+ trait :integer_value do
14
+ config_value { Faker::Number.number(digits: 3).to_s }
15
+ end
16
+
17
+ trait :decimal_value do
18
+ config_value { Faker::Number.decimal(l_digits: 3, r_digits: 2).to_s }
19
+ end
20
+
21
+ trait :boolean_value do
22
+ config_value { [ true, false ].sample.to_s }
23
+ end
24
+
25
+ trait :json_value do
26
+ value { { key: Faker::Lorem.word, value: Faker::Number.number(digits: 3) }.to_json }
27
+ end
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,456 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dscf-credit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Adoniyas
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-09-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: dscf-core
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 0.1.3
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: 0.1.3
26
+ - !ruby/object:Gem::Dependency
27
+ name: active_model_serializers
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ancestry
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 4.1.0
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 4.1.0
54
+ - !ruby/object:Gem::Dependency
55
+ name: bcrypt
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: httparty
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: image_processing
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: jwt
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: noticed
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rails
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: ransack
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :runtime
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ - !ruby/object:Gem::Dependency
153
+ name: pundit
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ type: :runtime
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ - !ruby/object:Gem::Dependency
167
+ name: database_cleaner-active_record
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: factory_bot_rails
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: faker
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: letter_opener
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: rspec-rails
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ - !ruby/object:Gem::Dependency
237
+ name: rspec-retry
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ - !ruby/object:Gem::Dependency
251
+ name: rubocop-rspec
252
+ requirement: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ type: :development
258
+ prerelease: false
259
+ version_requirements: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ version: '0'
264
+ - !ruby/object:Gem::Dependency
265
+ name: shoulda-matchers
266
+ requirement: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - ">="
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
271
+ type: :development
272
+ prerelease: false
273
+ version_requirements: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - ">="
276
+ - !ruby/object:Gem::Version
277
+ version: '0'
278
+ - !ruby/object:Gem::Dependency
279
+ name: simplecov
280
+ requirement: !ruby/object:Gem::Requirement
281
+ requirements:
282
+ - - ">="
283
+ - !ruby/object:Gem::Version
284
+ version: '0'
285
+ type: :development
286
+ prerelease: false
287
+ version_requirements: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - ">="
290
+ - !ruby/object:Gem::Version
291
+ version: '0'
292
+ description: An engine that contains the core models and controllers for credit scoring.
293
+ email:
294
+ - adoniyasg7s@gmail.com
295
+ executables: []
296
+ extensions: []
297
+ extra_rdoc_files: []
298
+ files:
299
+ - MIT-LICENSE
300
+ - README.md
301
+ - Rakefile
302
+ - app/controllers/dscf/credit/application_controller.rb
303
+ - app/controllers/dscf/credit/bank_branches_controller.rb
304
+ - app/controllers/dscf/credit/bank_staffs_controller.rb
305
+ - app/controllers/dscf/credit/banks_controller.rb
306
+ - app/controllers/dscf/credit/categories_controller.rb
307
+ - app/controllers/dscf/credit/credit_line_specs_controller.rb
308
+ - app/controllers/dscf/credit/credit_lines_controller.rb
309
+ - app/controllers/dscf/credit/facilitators_controller.rb
310
+ - app/controllers/dscf/credit/loans_controller.rb
311
+ - app/controllers/dscf/credit/parameter_normalizers_controller.rb
312
+ - app/controllers/dscf/credit/payment_requests_controller.rb
313
+ - app/controllers/dscf/credit/payments_controller.rb
314
+ - app/controllers/dscf/credit/scoring_parameters_controller.rb
315
+ - app/controllers/dscf/credit/scoring_tables_controller.rb
316
+ - app/controllers/dscf/credit/system_config_definitions_controller.rb
317
+ - app/controllers/dscf/credit/system_configs_controller.rb
318
+ - app/controllers/dscf/credit/users_controller.rb
319
+ - app/jobs/dscf/credit/application_job.rb
320
+ - app/mailers/dscf/credit/application_mailer.rb
321
+ - app/mailers/dscf/credit/bank_staff_welcome_mailer.rb
322
+ - app/mailers/dscf/credit/facilitator_mailer.rb
323
+ - app/models/dscf/credit/accounting_audit_request.rb
324
+ - app/models/dscf/credit/accounting_entry.rb
325
+ - app/models/dscf/credit/application_record.rb
326
+ - app/models/dscf/credit/bank.rb
327
+ - app/models/dscf/credit/bank_branch.rb
328
+ - app/models/dscf/credit/bank_staff.rb
329
+ - app/models/dscf/credit/category.rb
330
+ - app/models/dscf/credit/credit_line.rb
331
+ - app/models/dscf/credit/credit_line_spec.rb
332
+ - app/models/dscf/credit/daily_routine_transaction.rb
333
+ - app/models/dscf/credit/facilitator.rb
334
+ - app/models/dscf/credit/facilitator_performance.rb
335
+ - app/models/dscf/credit/failed_operations_log.rb
336
+ - app/models/dscf/credit/loan.rb
337
+ - app/models/dscf/credit/loan_profile.rb
338
+ - app/models/dscf/credit/loan_profile_scoring_spec.rb
339
+ - app/models/dscf/credit/loan_transaction.rb
340
+ - app/models/dscf/credit/parameter_normalizer.rb
341
+ - app/models/dscf/credit/payment.rb
342
+ - app/models/dscf/credit/payment_request.rb
343
+ - app/models/dscf/credit/scoring_parameter.rb
344
+ - app/models/dscf/credit/scoring_table.rb
345
+ - app/models/dscf/credit/system_config.rb
346
+ - app/models/dscf/credit/system_config_definition.rb
347
+ - app/serializers/dscf/core/business_serializer.rb
348
+ - app/serializers/dscf/core/business_type_serializer.rb
349
+ - app/serializers/dscf/core/role_serializer.rb
350
+ - app/serializers/dscf/core/user_profile_serializer.rb
351
+ - app/serializers/dscf/core/user_role_serializer.rb
352
+ - app/serializers/dscf/core/user_serializer.rb
353
+ - app/serializers/dscf/credit/bank_branch_serializer.rb
354
+ - app/serializers/dscf/credit/bank_serializer.rb
355
+ - app/serializers/dscf/credit/bank_staff_serializer.rb
356
+ - app/serializers/dscf/credit/category_serializer.rb
357
+ - app/serializers/dscf/credit/credit_line_serializer.rb
358
+ - app/serializers/dscf/credit/credit_line_spec_serializer.rb
359
+ - app/serializers/dscf/credit/parameter_normalizer_serializer.rb
360
+ - app/serializers/dscf/credit/scoring_parameter_serializer.rb
361
+ - app/serializers/dscf/credit/scoring_table_serializer.rb
362
+ - app/serializers/dscf/credit/system_config_definition_serializer.rb
363
+ - app/serializers/dscf/credit/system_config_serializer.rb
364
+ - app/services/dscf/credit/bank_staff_creation_service.rb
365
+ - app/services/dscf/credit/facilitator_additional_info_service.rb
366
+ - app/services/dscf/credit/facilitator_approval_service.rb
367
+ - app/views/dscf/credit/bank_staff_welcome_mailer/welcome_email.html.erb
368
+ - app/views/dscf/credit/bank_staff_welcome_mailer/welcome_email.text.erb
369
+ - app/views/dscf/credit/facilitator_mailer/additional_info_received.html.erb
370
+ - app/views/dscf/credit/facilitator_mailer/additional_info_received.text.erb
371
+ - app/views/dscf/credit/facilitator_mailer/approval_notification.html.erb
372
+ - app/views/dscf/credit/facilitator_mailer/approval_notification.text.erb
373
+ - app/views/dscf/credit/facilitator_mailer/limit_update_notification.html.erb
374
+ - app/views/dscf/credit/facilitator_mailer/limit_update_notification.text.erb
375
+ - app/views/dscf/credit/facilitator_mailer/rejection_notification.html.erb
376
+ - app/views/dscf/credit/facilitator_mailer/rejection_notification.text.erb
377
+ - app/views/layouts/mailer.html.erb
378
+ - app/views/layouts/mailer.text.erb
379
+ - config/locales/en.yml
380
+ - config/routes.rb
381
+ - db/migrate/20250822091011_create_dscf_credit_categories.rb
382
+ - db/migrate/20250822091015_create_dscf_credit_banks.rb
383
+ - db/migrate/20250822091055_create_dscf_credit_bank_branches.rb
384
+ - db/migrate/20250822091131_create_dscf_credit_credit_lines.rb
385
+ - db/migrate/20250822091527_create_dscf_credit_credit_line_specs.rb
386
+ - db/migrate/20250822091744_create_dscf_credit_system_config_definitions.rb
387
+ - db/migrate/20250822091820_create_dscf_credit_system_configs.rb
388
+ - db/migrate/20250822092050_create_dscf_credit_scoring_parameters.rb
389
+ - db/migrate/20250822092225_create_dscf_credit_parameter_normalizers.rb
390
+ - db/migrate/20250822092246_create_dscf_credit_loan_profiles.rb
391
+ - db/migrate/20250822092417_create_dscf_credit_loan_profile_scoring_specs.rb
392
+ - db/migrate/20250822092436_create_dscf_credit_facilitators.rb
393
+ - db/migrate/20250822092528_create_dscf_credit_facilitator_performances.rb
394
+ - db/migrate/20250822092608_create_dscf_credit_payment_requests.rb
395
+ - db/migrate/20250822092654_create_dscf_credit_loans.rb
396
+ - db/migrate/20250822092717_create_dscf_credit_loan_transactions.rb
397
+ - db/migrate/20250822092738_create_dscf_credit_daily_routine_transactions.rb
398
+ - db/migrate/20250822092819_create_dscf_credit_accounting_audit_requests.rb
399
+ - db/migrate/20250822092843_create_dscf_credit_payments.rb
400
+ - db/migrate/20250822092908_create_dscf_credit_failed_operations_logs.rb
401
+ - db/migrate/20250822092936_create_dscf_credit_accounting_entries.rb
402
+ - db/migrate/20250825231109_create_dscf_credit_bank_staff.rb
403
+ - db/migrate/20250901172842_create_dscf_credit_scoring_tables.rb
404
+ - db/seeds.rb
405
+ - lib/dscf/credit.rb
406
+ - lib/dscf/credit/engine.rb
407
+ - lib/dscf/credit/version.rb
408
+ - lib/tasks/dscf/credit_tasks.rake
409
+ - spec/factories/dscf/credit/accounting_audit_requests.rb
410
+ - spec/factories/dscf/credit/accounting_entries.rb
411
+ - spec/factories/dscf/credit/bank_branches.rb
412
+ - spec/factories/dscf/credit/bank_staffs.rb
413
+ - spec/factories/dscf/credit/banks.rb
414
+ - spec/factories/dscf/credit/categories.rb
415
+ - spec/factories/dscf/credit/credit_line_specs.rb
416
+ - spec/factories/dscf/credit/credit_lines.rb
417
+ - spec/factories/dscf/credit/daily_routine_transactions.rb
418
+ - spec/factories/dscf/credit/facilitator_performances.rb
419
+ - spec/factories/dscf/credit/facilitators.rb
420
+ - spec/factories/dscf/credit/failed_operations_logs.rb
421
+ - spec/factories/dscf/credit/loan_profile_scoring_specs.rb
422
+ - spec/factories/dscf/credit/loan_profiles.rb
423
+ - spec/factories/dscf/credit/loan_transactions.rb
424
+ - spec/factories/dscf/credit/loans.rb
425
+ - spec/factories/dscf/credit/parameter_normalizers.rb
426
+ - spec/factories/dscf/credit/payment_requests.rb
427
+ - spec/factories/dscf/credit/payments.rb
428
+ - spec/factories/dscf/credit/scoring_parameters.rb
429
+ - spec/factories/dscf/credit/scoring_tables.rb
430
+ - spec/factories/dscf/credit/system_config_definitions.rb
431
+ - spec/factories/dscf/credit/system_configs.rb
432
+ homepage: https://mksaddis.com/
433
+ licenses:
434
+ - MIT
435
+ metadata:
436
+ homepage_uri: https://mksaddis.com/
437
+ source_code_uri: https://github.com/BITS-DEVSEC
438
+ changelog_uri: https://github.com/BITS-DEVSEC
439
+ rdoc_options: []
440
+ require_paths:
441
+ - lib
442
+ required_ruby_version: !ruby/object:Gem::Requirement
443
+ requirements:
444
+ - - ">="
445
+ - !ruby/object:Gem::Version
446
+ version: '3.2'
447
+ required_rubygems_version: !ruby/object:Gem::Requirement
448
+ requirements:
449
+ - - ">="
450
+ - !ruby/object:Gem::Version
451
+ version: '0'
452
+ requirements: []
453
+ rubygems_version: 3.6.2
454
+ specification_version: 4
455
+ summary: An Engine for Credit Scoring
456
+ test_files: []