dscf-credit 0.1.2 → 0.1.3

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/dscf/core/authenticatable.rb +81 -0
  3. data/app/controllers/concerns/dscf/core/common.rb +200 -0
  4. data/app/controllers/concerns/dscf/core/filterable.rb +12 -0
  5. data/app/controllers/concerns/dscf/core/json_response.rb +77 -0
  6. data/app/controllers/concerns/dscf/core/pagination.rb +71 -0
  7. data/app/controllers/concerns/dscf/core/token_authenticatable.rb +53 -0
  8. data/app/controllers/dscf/credit/categories_controller.rb +3 -3
  9. data/app/controllers/dscf/credit/credit_limit_calculations_controller.rb +50 -0
  10. data/app/controllers/dscf/credit/credit_line_specs_controller.rb +2 -1
  11. data/app/controllers/dscf/credit/credit_lines_controller.rb +3 -3
  12. data/app/controllers/dscf/credit/disbursements_controller.rb +55 -0
  13. data/app/controllers/dscf/credit/eligible_credit_lines_controller.rb +50 -0
  14. data/app/controllers/dscf/credit/loan_profiles_controller.rb +138 -0
  15. data/app/controllers/dscf/credit/payment_requests_controller.rb +54 -5
  16. data/app/controllers/dscf/credit/repayments_controller.rb +53 -0
  17. data/app/controllers/dscf/credit/scoring_parameters_controller.rb +3 -3
  18. data/app/controllers/dscf/credit/scoring_tables_controller.rb +8 -8
  19. data/app/models/dscf/credit/bank_branch.rb +2 -1
  20. data/app/models/dscf/credit/category.rb +3 -1
  21. data/app/models/dscf/credit/credit_line.rb +3 -3
  22. data/app/models/dscf/credit/credit_line_spec.rb +3 -3
  23. data/app/models/dscf/credit/eligible_credit_line.rb +28 -0
  24. data/app/models/dscf/credit/loan_profile.rb +8 -5
  25. data/app/models/dscf/credit/loan_profile_scoring_spec.rb +4 -5
  26. data/app/models/dscf/credit/scoring_parameter.rb +2 -2
  27. data/app/models/dscf/credit/scoring_table.rb +4 -4
  28. data/app/serializers/dscf/credit/bank_branch_serializer.rb +1 -0
  29. data/app/serializers/dscf/credit/category_serializer.rb +2 -0
  30. data/app/serializers/dscf/credit/credit_line_serializer.rb +2 -0
  31. data/app/serializers/dscf/credit/credit_line_spec_serializer.rb +1 -1
  32. data/app/serializers/dscf/credit/daily_routine_transaction_serializer.rb +8 -0
  33. data/app/serializers/dscf/credit/eligible_credit_line_serializer.rb +8 -0
  34. data/app/serializers/dscf/credit/loan_profile_scoring_spec_serializer.rb +8 -0
  35. data/app/serializers/dscf/credit/loan_profile_serializer.rb +15 -0
  36. data/app/serializers/dscf/credit/loan_serializer.rb +12 -0
  37. data/app/serializers/dscf/credit/loan_transaction_serializer.rb +8 -0
  38. data/app/serializers/dscf/credit/payment_request_serializer.rb +10 -0
  39. data/app/serializers/dscf/credit/payment_serializer.rb +8 -0
  40. data/app/serializers/dscf/credit/scoring_parameter_serializer.rb +2 -0
  41. data/app/serializers/dscf/credit/scoring_table_serializer.rb +1 -1
  42. data/app/services/dscf/credit/credit_limit_calculation_service.rb +153 -0
  43. data/app/services/dscf/credit/disbursement_service.rb +180 -0
  44. data/app/services/dscf/credit/repayment_service.rb +216 -0
  45. data/app/services/dscf/credit/risk_application_service.rb +27 -0
  46. data/app/services/dscf/credit/scoring_service.rb +297 -0
  47. data/config/locales/en.yml +79 -0
  48. data/config/routes.rb +19 -5
  49. data/db/migrate/20250822091527_create_dscf_credit_credit_line_specs.rb +1 -0
  50. data/db/migrate/20250822092246_create_dscf_credit_loan_profiles.rb +2 -1
  51. data/db/migrate/20250822092417_create_dscf_credit_loan_profile_scoring_specs.rb +5 -8
  52. data/db/migrate/20250901172842_create_dscf_credit_scoring_tables.rb +2 -2
  53. data/db/migrate/20250917120000_create_dscf_credit_eligible_credit_lines.rb +18 -0
  54. data/db/seeds.rb +88 -22
  55. data/lib/dscf/credit/version.rb +1 -1
  56. data/spec/factories/dscf/credit/credit_line_specs.rb +1 -0
  57. data/spec/factories/dscf/credit/credit_lines.rb +3 -3
  58. data/spec/factories/dscf/credit/eligible_credit_lines.rb +33 -0
  59. data/spec/factories/dscf/credit/loan_profile_scoring_specs.rb +1 -4
  60. data/spec/factories/dscf/credit/loan_profiles.rb +1 -0
  61. data/spec/factories/dscf/credit/scoring_tables.rb +1 -1
  62. metadata +29 -2
data/db/seeds.rb CHANGED
@@ -170,7 +170,7 @@ end
170
170
 
171
171
  # 2. Bank Branches (depends on banks)
172
172
  puts "Seeding bank branches..."
173
- Dscf::Credit::BankBranch.find_or_create_by(bank: bank1, branch_name: 'Head Office') do |branch|
173
+ cbe_head_office = Dscf::Credit::BankBranch.find_or_create_by(bank: bank1, branch_name: 'Head Office') do |branch|
174
174
  branch.branch_code = 'CBE-HO-001'
175
175
  branch.branch_address = 'Churchill Avenue, Addis Ababa'
176
176
  branch.city = 'Addis Ababa'
@@ -343,6 +343,13 @@ corporate_category = Dscf::Credit::Category.find_or_create_by(type: 'credit_line
343
343
  category.description = 'Corporate credit category for large businesses'
344
344
  end
345
345
 
346
+ # Add eligibility category for scoring
347
+ eligibility_category = Dscf::Credit::Category.find_or_create_by(type: 'eligibility', name: 'default') do |category|
348
+ category.description = 'Default eligibility category for credit scoring'
349
+ end
350
+
351
+ puts "✓ Categories created/found"
352
+
346
353
  # 4.6. Scoring Param Types (independent)
347
354
  puts "Seeding scoring param types..."
348
355
  consumer_type = Dscf::Credit::ScoringParamType.find_or_create_by(name: 'Consumer') do |type|
@@ -448,10 +455,12 @@ scoring_param1 = Dscf::Credit::ScoringParameter.find_or_create_by(
448
455
  param.min_value = 0
449
456
  param.max_value = 1000000
450
457
  param.active = true
458
+ param.status = 'approved'
451
459
  param.reviewed_by = admin_user
452
460
  param.review_date = Time.current
453
461
  param.created_by = admin_user
454
462
  param.source = 'internal'
463
+ param.scoring_param_type = consumer_type
455
464
  param.document_reference = 'DOC-SP-001'
456
465
  end
457
466
 
@@ -465,10 +474,12 @@ scoring_param2 = Dscf::Credit::ScoringParameter.find_or_create_by(
465
474
  param.min_value = 300
466
475
  param.max_value = 850
467
476
  param.active = true
477
+ param.status = 'approved'
468
478
  param.reviewed_by = admin_user
469
479
  param.review_date = Time.current
470
480
  param.created_by = admin_user
471
481
  param.source = 'external'
482
+ param.scoring_param_type = consumer_type
472
483
  param.document_reference = 'DOC-SP-002'
473
484
  end
474
485
 
@@ -480,10 +491,12 @@ scoring_param3 = Dscf::Credit::ScoringParameter.find_or_create_by(
480
491
  param.data_type = 'string'
481
492
  param.weight = 0.2
482
493
  param.active = true
494
+ param.status = 'approved'
483
495
  param.reviewed_by = bank_admin
484
496
  param.review_date = Time.current
485
497
  param.created_by = admin_user
486
498
  param.source = 'internal'
499
+ param.scoring_param_type = consumer_type
487
500
  param.document_reference = 'DOC-SP-003'
488
501
  end
489
502
 
@@ -498,7 +511,7 @@ Dscf::Credit::ParameterNormalizer.find_or_create_by(
498
511
  ) do |normalizer|
499
512
  normalizer.name = 'Permanent Employment'
500
513
  normalizer.description = 'Full-time permanent employment'
501
- normalizer.normalized_value = 100
514
+ normalizer.normalized_value = 1.0
502
515
  end
503
516
 
504
517
  Dscf::Credit::ParameterNormalizer.find_or_create_by(
@@ -507,7 +520,7 @@ Dscf::Credit::ParameterNormalizer.find_or_create_by(
507
520
  ) do |normalizer|
508
521
  normalizer.name = 'Contract Employment'
509
522
  normalizer.description = 'Contract-based employment'
510
- normalizer.normalized_value = 70
523
+ normalizer.normalized_value = 0.7
511
524
  end
512
525
 
513
526
  Dscf::Credit::ParameterNormalizer.find_or_create_by(
@@ -516,7 +529,7 @@ Dscf::Credit::ParameterNormalizer.find_or_create_by(
516
529
  ) do |normalizer|
517
530
  normalizer.name = 'Self Employed'
518
531
  normalizer.description = 'Self-employed individual'
519
- normalizer.normalized_value = 60
532
+ normalizer.normalized_value = 0.6
520
533
  end
521
534
 
522
535
  # 8.5. Scoring Tables (depends on credit lines and scoring parameters)
@@ -529,7 +542,7 @@ employment_param = Dscf::Credit::ScoringParameter.find_by(bank: bank1, name: 'Em
529
542
  # Create scoring tables for credit_line1 (SME Credit Line)
530
543
  if monthly_income_param
531
544
  Dscf::Credit::ScoringTable.find_or_create_by(
532
- credit_line: credit_line1,
545
+ category: sme_category,
533
546
  scoring_parameter: monthly_income_param
534
547
  ) do |scoring_table|
535
548
  scoring_table.weight = 0.4
@@ -540,7 +553,7 @@ end
540
553
 
541
554
  if credit_history_param
542
555
  Dscf::Credit::ScoringTable.find_or_create_by(
543
- credit_line: credit_line1,
556
+ category: sme_category,
544
557
  scoring_parameter: credit_history_param
545
558
  ) do |scoring_table|
546
559
  scoring_table.weight = 0.35
@@ -551,7 +564,7 @@ end
551
564
 
552
565
  if employment_param
553
566
  Dscf::Credit::ScoringTable.find_or_create_by(
554
- credit_line: credit_line1,
567
+ category: sme_category,
555
568
  scoring_parameter: employment_param
556
569
  ) do |scoring_table|
557
570
  scoring_table.weight = 0.25
@@ -563,7 +576,7 @@ end
563
576
  # Create scoring tables for credit_line2 (Personal Credit Line)
564
577
  if monthly_income_param
565
578
  Dscf::Credit::ScoringTable.find_or_create_by(
566
- credit_line: credit_line2,
579
+ category: personal_category,
567
580
  scoring_parameter: monthly_income_param
568
581
  ) do |scoring_table|
569
582
  scoring_table.weight = 0.5
@@ -574,7 +587,7 @@ end
574
587
 
575
588
  if credit_history_param
576
589
  Dscf::Credit::ScoringTable.find_or_create_by(
577
- credit_line: credit_line2,
590
+ category: personal_category,
578
591
  scoring_parameter: credit_history_param
579
592
  ) do |scoring_table|
580
593
  scoring_table.weight = 0.3
@@ -585,7 +598,7 @@ end
585
598
 
586
599
  if employment_param
587
600
  Dscf::Credit::ScoringTable.find_or_create_by(
588
- credit_line: credit_line2,
601
+ category: personal_category,
589
602
  scoring_parameter: employment_param
590
603
  ) do |scoring_table|
591
604
  scoring_table.weight = 0.2
@@ -594,6 +607,40 @@ if employment_param
594
607
  end
595
608
  end
596
609
 
610
+ # Create scoring tables for eligibility_category
611
+ if monthly_income_param
612
+ Dscf::Credit::ScoringTable.find_or_create_by(
613
+ category: eligibility_category,
614
+ scoring_parameter: monthly_income_param
615
+ ) do |scoring_table|
616
+ scoring_table.weight = 0.4
617
+ scoring_table.active = true
618
+ scoring_table.created_by = admin_user
619
+ end
620
+ end
621
+
622
+ if credit_history_param
623
+ Dscf::Credit::ScoringTable.find_or_create_by(
624
+ category: eligibility_category,
625
+ scoring_parameter: credit_history_param
626
+ ) do |scoring_table|
627
+ scoring_table.weight = 0.35
628
+ scoring_table.active = true
629
+ scoring_table.created_by = admin_user
630
+ end
631
+ end
632
+
633
+ if employment_param
634
+ Dscf::Credit::ScoringTable.find_or_create_by(
635
+ category: eligibility_category,
636
+ scoring_parameter: employment_param
637
+ ) do |scoring_table|
638
+ scoring_table.weight = 0.25
639
+ scoring_table.active = true
640
+ scoring_table.created_by = admin_user
641
+ end
642
+ end
643
+
597
644
  # 9. Loan Profiles (depends on banks and users)
598
645
  puts "Seeding loan profiles..."
599
646
  loan_profile1 = Dscf::Credit::LoanProfile.find_or_create_by(
@@ -604,11 +651,12 @@ loan_profile1 = Dscf::Credit::LoanProfile.find_or_create_by(
604
651
  profile.total_amount = 100000.00
605
652
  profile.available_amount = 75000.00
606
653
  profile.reviewed_by = bank_admin
654
+ profile.review_branch = cbe_head_office
607
655
  profile.review_date = Time.current
608
656
  # Note: backer will be set when facilitators are created via API
609
657
  end
610
658
 
611
- # 12. Loan Profile Scoring Specs (depends on loan profiles)
659
+ # 10. Loan Profile Scoring Specs (depends on loan profiles)
612
660
  puts "Seeding loan profile scoring specs..."
613
661
  Dscf::Credit::LoanProfileScoringSpec.create!(
614
662
  loan_profile: loan_profile1,
@@ -617,16 +665,34 @@ Dscf::Credit::LoanProfileScoringSpec.create!(
617
665
  'credit_history_score' => 720,
618
666
  'employment_type' => 'permanent',
619
667
  'years_at_job' => 3,
620
- 'existing_debt' => 15000
668
+ 'existing_debt' => 15000,
669
+ 'average_daily_purchase' => 15000 # Wholesaler's average daily purchase volume
621
670
  },
622
671
  score: 78.5,
672
+ total_limit: 100000.00,
623
673
  active: true,
624
- reviewed_by: admin_user,
625
- review_date: Time.current,
626
674
  created_by: admin_user
627
675
  )
628
676
 
629
- # 13. Payment Requests (depends on users)
677
+ # 11. Eligible Credit Lines (depends on loan profiles and credit lines)
678
+ puts "Seeding eligible credit lines..."
679
+ Dscf::Credit::EligibleCreditLine.create!(
680
+ loan_profile: loan_profile1,
681
+ credit_line: credit_line1,
682
+ credit_limit: 75000.00,
683
+ available_limit: 67500.00,
684
+ risk: 0.35
685
+ )
686
+
687
+ Dscf::Credit::EligibleCreditLine.create!(
688
+ loan_profile: loan_profile1,
689
+ credit_line: credit_line2,
690
+ credit_limit: 50000.00,
691
+ available_limit: 42500.00,
692
+ risk: 0.45
693
+ )
694
+
695
+ # 12. Payment Requests (depends on users)
630
696
  puts "Seeding payment requests..."
631
697
  payment_request1 = Dscf::Credit::PaymentRequest.create!(
632
698
  user: user2,
@@ -649,7 +715,7 @@ payment_request2 = Dscf::Credit::PaymentRequest.create!(
649
715
  initiated_at: 1.hour.ago
650
716
  )
651
717
 
652
- # 14. Loans (depends on loan profiles, credit lines, and payment requests)
718
+ # 13. Loans (depends on loan profiles, credit lines, and payment requests)
653
719
  puts "Seeding loans..."
654
720
  loan1 = Dscf::Credit::Loan.create!(
655
721
  loan_profile: loan_profile1,
@@ -666,7 +732,7 @@ loan1 = Dscf::Credit::Loan.create!(
666
732
  disbursed_at: 1.day.ago
667
733
  )
668
734
 
669
- # 15. Loan Transactions (depends on loans)
735
+ # 14. Loan Transactions (depends on loans)
670
736
  puts "Seeding loan transactions..."
671
737
  Dscf::Credit::LoanTransaction.create!(
672
738
  loan: loan1,
@@ -684,7 +750,7 @@ Dscf::Credit::LoanTransaction.create!(
684
750
  status: 'completed'
685
751
  )
686
752
 
687
- # 16. Daily Routine Transactions (depends on loans)
753
+ # 15. Daily Routine Transactions (depends on loans)
688
754
  puts "Seeding daily routine transactions..."
689
755
  Dscf::Credit::DailyRoutineTransaction.create!(
690
756
  loan: loan1,
@@ -695,7 +761,7 @@ Dscf::Credit::DailyRoutineTransaction.create!(
695
761
  approved_at: Date.current.beginning_of_day + 1.hour
696
762
  )
697
763
 
698
- # 17. Payments (depends on payment requests)
764
+ # 16. Payments (depends on payment requests)
699
765
  puts "Seeding payments..."
700
766
  Dscf::Credit::Payment.create!(
701
767
  payment_request: payment_request1,
@@ -706,7 +772,7 @@ Dscf::Credit::Payment.create!(
706
772
  processed_at: 1.day.ago
707
773
  )
708
774
 
709
- # 18. Accounting Audit Requests (depends on various entities)
775
+ # 17. Accounting Audit Requests (depends on various entities)
710
776
  puts "Seeding accounting audit requests..."
711
777
  audit_request1 = Dscf::Credit::AccountingAuditRequest.create!(
712
778
  source_entity: loan1,
@@ -724,7 +790,7 @@ Dscf::Credit::AccountingAuditRequest.create!(
724
790
  status: 'pending'
725
791
  )
726
792
 
727
- # 19. Accounting Entries (depends on audit requests)
793
+ # 18. Accounting Entries (depends on audit requests)
728
794
  puts "Seeding accounting entries..."
729
795
  Dscf::Credit::AccountingEntry.create!(
730
796
  audit_request: audit_request1,
@@ -742,7 +808,7 @@ Dscf::Credit::AccountingEntry.create!(
742
808
  status: 'completed'
743
809
  )
744
810
 
745
- # 20. Failed Operations Logs (depends on various entities)
811
+ # 19. Failed Operations Logs (depends on various entities)
746
812
  puts "Seeding failed operations logs..."
747
813
  Dscf::Credit::FailedOperationsLog.create!(
748
814
  entity: payment_request2,
@@ -1,5 +1,5 @@
1
1
  module Dscf
2
2
  module Credit
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.3"
4
4
  end
5
5
  end
@@ -8,6 +8,7 @@ FactoryBot.define do
8
8
  penalty_rate { Faker::Number.decimal(l_digits: 1, r_digits: 4).to_f }
9
9
  facilitation_fee_rate { Faker::Number.decimal(l_digits: 1, r_digits: 4).to_f }
10
10
  tax_rate { Faker::Number.decimal(l_digits: 1, r_digits: 4).to_f }
11
+ credit_line_multiplier { Faker::Number.between(from: 15, to: 60) }
11
12
  max_penalty_days { Faker::Number.between(from: 30, to: 90) }
12
13
  loan_duration { Faker::Number.between(from: 30, to: 365) }
13
14
  interest_frequency { %w[daily weekly monthly quarterly annually].sample }
@@ -7,8 +7,8 @@ FactoryBot.define do
7
7
  name { "#{Faker::Finance.credit_card(:visa)} Credit Line" }
8
8
  sequence(:code) { |n| "CL#{n.to_s.rjust(4, '0')}" }
9
9
  description { Faker::Lorem.paragraph }
10
- status { %w[pending approved active suspended].sample }
11
- review_date { Faker::Date.between(from: 6.months.ago, to: Date.current) if status.in?(%w[approved active]) }
10
+ status { %w[pending approved suspended].sample }
11
+ review_date { Faker::Date.between(from: 6.months.ago, to: Date.current) if status.in?(%w[approved]) }
12
12
  document_reference { Faker::Alphanumeric.alphanumeric(number: 10).upcase }
13
13
  review_feedback { {} }
14
14
 
@@ -23,7 +23,7 @@ FactoryBot.define do
23
23
  end
24
24
 
25
25
  trait :active do
26
- status { "active" }
26
+ status { "approved" }
27
27
  review_date { Faker::Date.between(from: 6.months.ago, to: Date.current) }
28
28
  end
29
29
 
@@ -0,0 +1,33 @@
1
+ FactoryBot.define do
2
+ factory :eligible_credit_line, class: "Dscf::Credit::EligibleCreditLine" do
3
+ association :loan_profile, factory: :loan_profile
4
+ association :credit_line, factory: :credit_line
5
+ credit_limit { Faker::Number.decimal(l_digits: 5, r_digits: 2) }
6
+ available_limit { Faker::Number.decimal(l_digits: 4, r_digits: 2) }
7
+ risk { nil } # Risk should not be set at creation, only through apply_risk endpoint
8
+
9
+ trait :with_applied_risk do
10
+ risk { Faker::Number.decimal(l_digits: 1, r_digits: 4).clamp(0.01, 0.9) }
11
+ end
12
+
13
+ trait :low_risk do
14
+ risk { Faker::Number.decimal(l_digits: 1, r_digits: 4).clamp(0.01, 0.3) }
15
+ end
16
+
17
+ trait :medium_risk do
18
+ risk { Faker::Number.decimal(l_digits: 1, r_digits: 4).clamp(0.31, 0.6) }
19
+ end
20
+
21
+ trait :high_risk do
22
+ risk { Faker::Number.decimal(l_digits: 1, r_digits: 4).clamp(0.61, 0.9) }
23
+ end
24
+
25
+ trait :small_credit_limit do
26
+ credit_limit { Faker::Number.decimal(l_digits: 3, r_digits: 2) }
27
+ end
28
+
29
+ trait :large_credit_limit do
30
+ credit_limit { Faker::Number.decimal(l_digits: 6, r_digits: 2) }
31
+ end
32
+ end
33
+ end
@@ -2,13 +2,10 @@ FactoryBot.define do
2
2
  factory :loan_profile_scoring_spec, class: "Dscf::Credit::LoanProfileScoringSpec" do
3
3
  association :loan_profile, factory: :loan_profile
4
4
  association :created_by, factory: :user if defined?(Dscf::Core::User)
5
- association :reviewed_by, factory: :user if defined?(Dscf::Core::User)
6
5
  scoring_input_data { Faker::Json.shallow_json(width: 5, options: { key: 'Name.name', value: 'Number.number' }) }
7
6
  score { Faker::Number.decimal(l_digits: 2, r_digits: 2) }
7
+ total_limit { Faker::Number.decimal(l_digits: 6, r_digits: 2) }
8
8
  active { true }
9
- review_date { Faker::Date.between(from: 6.months.ago, to: Date.current) }
10
- review_feedback { {} }
11
-
12
9
  trait :active do
13
10
  active { true }
14
11
  end
@@ -1,6 +1,7 @@
1
1
  FactoryBot.define do
2
2
  factory :loan_profile, class: "Dscf::Credit::LoanProfile" do
3
3
  association :bank, factory: :bank
4
+ association :review_branch, factory: :bank_branch
4
5
  association :reviewed_by, factory: :user if defined?(Dscf::Core::User)
5
6
  association :user, factory: :user if defined?(Dscf::Core::User)
6
7
  association :backer, factory: :user if defined?(Dscf::Core::User)
@@ -1,6 +1,6 @@
1
1
  FactoryBot.define do
2
2
  factory :scoring_table, class: "Dscf::Credit::ScoringTable" do
3
- association :credit_line, factory: :credit_line
3
+ association :category, factory: :category
4
4
  association :scoring_parameter, factory: :scoring_parameter
5
5
  association :created_by, factory: :user if defined?(Dscf::Core::User)
6
6
  weight { Faker::Number.decimal(l_digits: 0, r_digits: 4).clamp(0.0001, 1.0) }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dscf-credit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adoniyas
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-09-09 00:00:00.000000000 Z
10
+ date: 2025-09-20 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: dscf-core
@@ -313,19 +313,30 @@ files:
313
313
  - MIT-LICENSE
314
314
  - README.md
315
315
  - Rakefile
316
+ - app/controllers/concerns/dscf/core/authenticatable.rb
317
+ - app/controllers/concerns/dscf/core/common.rb
318
+ - app/controllers/concerns/dscf/core/filterable.rb
319
+ - app/controllers/concerns/dscf/core/json_response.rb
320
+ - app/controllers/concerns/dscf/core/pagination.rb
321
+ - app/controllers/concerns/dscf/core/token_authenticatable.rb
316
322
  - app/controllers/concerns/dscf/credit/reviewable.rb
317
323
  - app/controllers/dscf/credit/application_controller.rb
318
324
  - app/controllers/dscf/credit/bank_branches_controller.rb
319
325
  - app/controllers/dscf/credit/bank_staffs_controller.rb
320
326
  - app/controllers/dscf/credit/banks_controller.rb
321
327
  - app/controllers/dscf/credit/categories_controller.rb
328
+ - app/controllers/dscf/credit/credit_limit_calculations_controller.rb
322
329
  - app/controllers/dscf/credit/credit_line_specs_controller.rb
323
330
  - app/controllers/dscf/credit/credit_lines_controller.rb
331
+ - app/controllers/dscf/credit/disbursements_controller.rb
332
+ - app/controllers/dscf/credit/eligible_credit_lines_controller.rb
324
333
  - app/controllers/dscf/credit/facilitators_controller.rb
334
+ - app/controllers/dscf/credit/loan_profiles_controller.rb
325
335
  - app/controllers/dscf/credit/loans_controller.rb
326
336
  - app/controllers/dscf/credit/parameter_normalizers_controller.rb
327
337
  - app/controllers/dscf/credit/payment_requests_controller.rb
328
338
  - app/controllers/dscf/credit/payments_controller.rb
339
+ - app/controllers/dscf/credit/repayments_controller.rb
329
340
  - app/controllers/dscf/credit/scoring_param_types_controller.rb
330
341
  - app/controllers/dscf/credit/scoring_parameters_controller.rb
331
342
  - app/controllers/dscf/credit/scoring_tables_controller.rb
@@ -346,6 +357,7 @@ files:
346
357
  - app/models/dscf/credit/credit_line.rb
347
358
  - app/models/dscf/credit/credit_line_spec.rb
348
359
  - app/models/dscf/credit/daily_routine_transaction.rb
360
+ - app/models/dscf/credit/eligible_credit_line.rb
349
361
  - app/models/dscf/credit/facilitator.rb
350
362
  - app/models/dscf/credit/facilitator_performance.rb
351
363
  - app/models/dscf/credit/failed_operations_log.rb
@@ -373,18 +385,31 @@ files:
373
385
  - app/serializers/dscf/credit/category_serializer.rb
374
386
  - app/serializers/dscf/credit/credit_line_serializer.rb
375
387
  - app/serializers/dscf/credit/credit_line_spec_serializer.rb
388
+ - app/serializers/dscf/credit/daily_routine_transaction_serializer.rb
389
+ - app/serializers/dscf/credit/eligible_credit_line_serializer.rb
376
390
  - app/serializers/dscf/credit/facilitator_performance_serializer.rb
377
391
  - app/serializers/dscf/credit/facilitator_serializer.rb
392
+ - app/serializers/dscf/credit/loan_profile_scoring_spec_serializer.rb
393
+ - app/serializers/dscf/credit/loan_profile_serializer.rb
394
+ - app/serializers/dscf/credit/loan_serializer.rb
395
+ - app/serializers/dscf/credit/loan_transaction_serializer.rb
378
396
  - app/serializers/dscf/credit/parameter_normalizer_serializer.rb
397
+ - app/serializers/dscf/credit/payment_request_serializer.rb
398
+ - app/serializers/dscf/credit/payment_serializer.rb
379
399
  - app/serializers/dscf/credit/scoring_param_type_serializer.rb
380
400
  - app/serializers/dscf/credit/scoring_parameter_serializer.rb
381
401
  - app/serializers/dscf/credit/scoring_table_serializer.rb
382
402
  - app/serializers/dscf/credit/system_config_definition_serializer.rb
383
403
  - app/serializers/dscf/credit/system_config_serializer.rb
384
404
  - app/services/dscf/credit/bank_staff_creation_service.rb
405
+ - app/services/dscf/credit/credit_limit_calculation_service.rb
406
+ - app/services/dscf/credit/disbursement_service.rb
385
407
  - app/services/dscf/credit/facilitator_additional_info_service.rb
386
408
  - app/services/dscf/credit/facilitator_approval_service.rb
387
409
  - app/services/dscf/credit/facilitator_creation_service.rb
410
+ - app/services/dscf/credit/repayment_service.rb
411
+ - app/services/dscf/credit/risk_application_service.rb
412
+ - app/services/dscf/credit/scoring_service.rb
388
413
  - app/views/dscf/credit/bank_staff_welcome_mailer/welcome_email.html.erb
389
414
  - app/views/dscf/credit/bank_staff_welcome_mailer/welcome_email.text.erb
390
415
  - app/views/dscf/credit/facilitator_mailer/additional_info_received.html.erb
@@ -423,6 +448,7 @@ files:
423
448
  - db/migrate/20250822092936_create_dscf_credit_accounting_entries.rb
424
449
  - db/migrate/20250825231109_create_dscf_credit_bank_staff.rb
425
450
  - db/migrate/20250901172842_create_dscf_credit_scoring_tables.rb
451
+ - db/migrate/20250917120000_create_dscf_credit_eligible_credit_lines.rb
426
452
  - db/seeds.rb
427
453
  - lib/dscf/credit.rb
428
454
  - lib/dscf/credit/engine.rb
@@ -437,6 +463,7 @@ files:
437
463
  - spec/factories/dscf/credit/credit_line_specs.rb
438
464
  - spec/factories/dscf/credit/credit_lines.rb
439
465
  - spec/factories/dscf/credit/daily_routine_transactions.rb
466
+ - spec/factories/dscf/credit/eligible_credit_lines.rb
440
467
  - spec/factories/dscf/credit/facilitator_performances.rb
441
468
  - spec/factories/dscf/credit/facilitators.rb
442
469
  - spec/factories/dscf/credit/failed_operations_logs.rb