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.
- checksums.yaml +4 -4
- data/app/controllers/concerns/dscf/core/authenticatable.rb +81 -0
- data/app/controllers/concerns/dscf/core/common.rb +200 -0
- data/app/controllers/concerns/dscf/core/filterable.rb +12 -0
- data/app/controllers/concerns/dscf/core/json_response.rb +77 -0
- data/app/controllers/concerns/dscf/core/pagination.rb +71 -0
- data/app/controllers/concerns/dscf/core/token_authenticatable.rb +53 -0
- data/app/controllers/dscf/credit/categories_controller.rb +3 -3
- data/app/controllers/dscf/credit/credit_limit_calculations_controller.rb +50 -0
- data/app/controllers/dscf/credit/credit_line_specs_controller.rb +2 -1
- data/app/controllers/dscf/credit/credit_lines_controller.rb +3 -3
- data/app/controllers/dscf/credit/disbursements_controller.rb +55 -0
- data/app/controllers/dscf/credit/eligible_credit_lines_controller.rb +50 -0
- data/app/controllers/dscf/credit/loan_profiles_controller.rb +138 -0
- data/app/controllers/dscf/credit/payment_requests_controller.rb +54 -5
- data/app/controllers/dscf/credit/repayments_controller.rb +53 -0
- data/app/controllers/dscf/credit/scoring_parameters_controller.rb +3 -3
- data/app/controllers/dscf/credit/scoring_tables_controller.rb +8 -8
- data/app/models/dscf/credit/bank_branch.rb +2 -1
- data/app/models/dscf/credit/category.rb +3 -1
- data/app/models/dscf/credit/credit_line.rb +3 -3
- data/app/models/dscf/credit/credit_line_spec.rb +3 -3
- data/app/models/dscf/credit/eligible_credit_line.rb +28 -0
- data/app/models/dscf/credit/loan_profile.rb +8 -5
- data/app/models/dscf/credit/loan_profile_scoring_spec.rb +4 -5
- data/app/models/dscf/credit/scoring_parameter.rb +2 -2
- data/app/models/dscf/credit/scoring_table.rb +4 -4
- data/app/serializers/dscf/credit/bank_branch_serializer.rb +1 -0
- data/app/serializers/dscf/credit/category_serializer.rb +2 -0
- data/app/serializers/dscf/credit/credit_line_serializer.rb +2 -0
- data/app/serializers/dscf/credit/credit_line_spec_serializer.rb +1 -1
- data/app/serializers/dscf/credit/daily_routine_transaction_serializer.rb +8 -0
- data/app/serializers/dscf/credit/eligible_credit_line_serializer.rb +8 -0
- data/app/serializers/dscf/credit/loan_profile_scoring_spec_serializer.rb +8 -0
- data/app/serializers/dscf/credit/loan_profile_serializer.rb +15 -0
- data/app/serializers/dscf/credit/loan_serializer.rb +12 -0
- data/app/serializers/dscf/credit/loan_transaction_serializer.rb +8 -0
- data/app/serializers/dscf/credit/payment_request_serializer.rb +10 -0
- data/app/serializers/dscf/credit/payment_serializer.rb +8 -0
- data/app/serializers/dscf/credit/scoring_parameter_serializer.rb +2 -0
- data/app/serializers/dscf/credit/scoring_table_serializer.rb +1 -1
- data/app/services/dscf/credit/credit_limit_calculation_service.rb +153 -0
- data/app/services/dscf/credit/disbursement_service.rb +180 -0
- data/app/services/dscf/credit/repayment_service.rb +216 -0
- data/app/services/dscf/credit/risk_application_service.rb +27 -0
- data/app/services/dscf/credit/scoring_service.rb +297 -0
- data/config/locales/en.yml +79 -0
- data/config/routes.rb +19 -5
- data/db/migrate/20250822091527_create_dscf_credit_credit_line_specs.rb +1 -0
- data/db/migrate/20250822092246_create_dscf_credit_loan_profiles.rb +2 -1
- data/db/migrate/20250822092417_create_dscf_credit_loan_profile_scoring_specs.rb +5 -8
- data/db/migrate/20250901172842_create_dscf_credit_scoring_tables.rb +2 -2
- data/db/migrate/20250917120000_create_dscf_credit_eligible_credit_lines.rb +18 -0
- data/db/seeds.rb +88 -22
- data/lib/dscf/credit/version.rb +1 -1
- data/spec/factories/dscf/credit/credit_line_specs.rb +1 -0
- data/spec/factories/dscf/credit/credit_lines.rb +3 -3
- data/spec/factories/dscf/credit/eligible_credit_lines.rb +33 -0
- data/spec/factories/dscf/credit/loan_profile_scoring_specs.rb +1 -4
- data/spec/factories/dscf/credit/loan_profiles.rb +1 -0
- data/spec/factories/dscf/credit/scoring_tables.rb +1 -1
- 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 =
|
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 =
|
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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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,
|
data/lib/dscf/credit/version.rb
CHANGED
@@ -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
|
11
|
-
review_date { Faker::Date.between(from: 6.months.ago, to: Date.current) if status.in?(%w[approved
|
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 { "
|
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 :
|
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.
|
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-
|
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
|