Class: Dscf::Credit::LoanAccrualGeneratorService
- Inherits:
-
Object
- Object
- Dscf::Credit::LoanAccrualGeneratorService
- Defined in:
- app/services/dscf/credit/loan_accrual_generator_service.rb
Overview
LoanAccrualGeneratorService generates daily interest and penalty accruals for active loans. This service is designed to be run daily by a background job/cron job.
Instance Attribute Summary collapse
-
#accrual_date ⇒ Object
readonly
Returns the value of attribute accrual_date.
-
#force_regenerate ⇒ Object
readonly
Returns the value of attribute force_regenerate.
-
#loan_ids ⇒ Object
readonly
Returns the value of attribute loan_ids.
Instance Method Summary collapse
-
#generate_daily_accruals ⇒ Hash
Generate daily accruals for eligible loans.
-
#initialize(loan_ids: nil, accrual_date: Date.current, force_regenerate: false) ⇒ LoanAccrualGeneratorService
constructor
Initialize the loan accrual generator service.
Constructor Details
#initialize(loan_ids: nil, accrual_date: Date.current, force_regenerate: false) ⇒ LoanAccrualGeneratorService
Initialize the loan accrual generator service
29 30 31 32 33 |
# File 'app/services/dscf/credit/loan_accrual_generator_service.rb', line 29 def initialize(loan_ids: nil, accrual_date: Date.current, force_regenerate: false) @loan_ids = loan_ids @accrual_date = accrual_date @force_regenerate = force_regenerate end |
Instance Attribute Details
#accrual_date ⇒ Object (readonly)
Returns the value of attribute accrual_date.
20 21 22 |
# File 'app/services/dscf/credit/loan_accrual_generator_service.rb', line 20 def accrual_date @accrual_date end |
#force_regenerate ⇒ Object (readonly)
Returns the value of attribute force_regenerate.
20 21 22 |
# File 'app/services/dscf/credit/loan_accrual_generator_service.rb', line 20 def force_regenerate @force_regenerate end |
#loan_ids ⇒ Object (readonly)
Returns the value of attribute loan_ids.
20 21 22 |
# File 'app/services/dscf/credit/loan_accrual_generator_service.rb', line 20 def loan_ids @loan_ids end |
Instance Method Details
#generate_daily_accruals ⇒ Hash
Generate daily accruals for eligible loans
Eligible loans are those with:
-
Status: active, overdue, or disbursed
-
Have outstanding balance (remaining_amount > 0 or pending accruals exist)
For each eligible loan:
-
Calculate daily interest based on principal and interest rate
-
Calculate penalty if loan is overdue
-
Create accrual records with status=‘pending’
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'app/services/dscf/credit/loan_accrual_generator_service.rb', line 67 def generate_daily_accruals loans = fetch_eligible_loans return success_result([], []) if loans.empty? accrual_details = [] errors = [] loans.each do |loan| begin loan_accruals = generate_accruals_for_loan(loan) accrual_details.concat(loan_accruals) rescue StandardError => e errors << { loan_id: loan.id, error: e. } end end success_result(accrual_details, errors) rescue StandardError => e error_result("Accrual generation failed: #{e.}") end |