[
https://issues.apache.org/jira/browse/FINERACT-2992?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18134288#comment-18134288
]
Adam Saghy commented on FINERACT-2992:
--------------------------------------
[~alberto_art3ch] Duplicate with
[https://issues.apache.org/jira/browse/FINERACT-1322?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel?]
> Introduce a loan-only repayment frequency type instead of extending
> PeriodFrequencyType
> ---------------------------------------------------------------------------------------
>
> Key: FINERACT-2992
> URL: https://issues.apache.org/jira/browse/FINERACT-2992
> Project: Apache Fineract
> Issue Type: Improvement
> Components: Loan, Savings, Shares
> Affects Versions: 1.16.0
> Reporter: Jose Alberto Hernandez
> Priority: Minor
> Labels: backwards-compatibility, loan, refactoring, tech-debt
> Fix For: 1.17.0
>
>
> ```
> h2. Background
> FINERACT-1322 (PR #6546) adds the semi-monthly repayment frequency to loans
> by appending \{{SEMI_MONTHLY(6)}} to
> \{{org.apache.fineract.portfolio.common.domain.PeriodFrequencyType}}. That
> enum is shared by loans, savings and deposit lock-in periods, recurring
> deposit frequencies, share lock-in periods and interest rate charts.
> Semi-monthly only has a meaning for loan repayments, so the shared enum now
> carries a value that most of its users must explicitly ignore.
> h2. Problem / Motivation
> * Every exhaustive \{{switch}} over \{{PeriodFrequencyType}} outside the loan
> domain needed a dummy \{{case SEMI_MONTHLY}} branch that only exists to keep
> the switch exhaustive: \{{SavingsAccount}} (lock-in),
> \{{DepositAccountUtils}} (recurring deposit date),
> \{{ShareAccountDataSerializer}} (lock-in) and
> \{{InterestRateChartEnumerations}}.
> * \{{PeriodFrequencyType.integerValues()}} filters \{{SEMI_MONTHLY}} out so
> that interest rate chart validation does not accept it; the savings, deposit
> and share validators rely on \{{inMinMaxRange(0, 3)}} to keep the value out.
> The fence works, but it is spread over several modules and easy to break when
> the next loan-only frequency is added.
> * This was raised in the review of PR #6546 by @galovics and agreed as a
> follow-up; see the dev@ thread: <link>.
> h2. Proposed change
> * Add a loan-specific frequency type (for example
> \{{LoanRepaymentFrequencyType}} in \{{fineract-loan}}) with \{{DAYS}},
> \{{WEEKS}}, \{{MONTHS}}, \{{YEARS}} and \{{SEMI_MONTHLY}}, keeping the
> persisted integer values of \{{PeriodFrequencyType}} (0-3 and 6) so no data
> migration is needed for \{{m_product_loan.repayment_period_frequency_enum}}
> and \{{m_loan.repayment_period_frequency_enum}}.
> * Change \{{repaymentPeriodFrequencyType}} to the new type in the loan
> domain: \{{LoanProductRelatedDetail}}, \{{ILoanConfigurationDetails}} /
> \{{LoanConfigurationDetails}}, \{{LoanApplicationTerms}},
> \{{ScheduledDateGenerator}} / \{{DefaultScheduledDateGenerator}},
> \{{PaymentPeriodsInOneYearCalculator}}, \{{AprCalculator}},
> \{{LoanScheduleAssembler}}, the progressive EMI calculator and interest
> schedule model, and the loan read/write services and enumerations.
> * Provide explicit conversion where the loan domain still talks to shared
> code that expects \{{PeriodFrequencyType}} (calendar utilities, re-aging,
> charge frequencies, API option lists), instead of relying on the shared enum
> carrying loan-only values.
> * Remove \{{SEMI_MONTHLY}} from \{{PeriodFrequencyType}}, together with the
> dummy \{{case SEMI_MONTHLY}} branches in savings, deposits, shares and
> interest rate charts and the special case in \{{integerValues()}}.
> * Keep the REST contract unchanged: \{{repaymentFrequencyType}} stays an
> integer with the same values on loan products, loans, templates and schedule
> calculation; the option lists returned by the templates must still include
> semi-monthly for loans only.
> h2. Affected modules
> * \{{fineract-core}} — \{{PeriodFrequencyType}} loses \{{SEMI_MONTHLY}} and
> the \{{integerValues()}} special case; \{{CommonEnumerations}} loses the
> loan-only option.
> * \{{fineract-loan}} — new frequency type, \{{repaymentPeriodFrequencyType}}
> retyped across product, loan terms and schedule generation.
> * \{{fineract-progressive-loan}} — EMI calculator and interest schedule model
> use the new type.
> * \{{fineract-provider}} — loan assemblers, validators, read/write services,
> re-aging validator and interest rate chart enumerations; share account
> serializer loses the dummy branch.
> * \{{fineract-savings}} — \{{SavingsAccount}} and \{{DepositAccountUtils}}
> lose the dummy branch.
> * \{{fineract-e2e-tests-core}} / \{{integration-tests}} — test enums and
> builders follow the new type where they reference it by name.
> h2. Acceptance criteria
> * \{{PeriodFrequencyType}} has no \{{SEMI_MONTHLY}} constant and no module
> outside loans contains a \{{case SEMI_MONTHLY}} branch.
> * Semi-monthly loan products and loans created before the change load,
> generate schedules and repay exactly as before; no Liquibase changeset is
> required.
> * The loan product and loan APIs accept and return
> \{{repaymentFrequencyType}} with the same integer values as today, including
> \{{6}} for semi-monthly.
> * Savings, deposit, share lock-in and interest rate chart APIs keep rejecting
> value \{{6}} with HTTP 400.
> * Existing unit, integration and E2E tests for the semi-monthly frequency
> (for example \{{LoanSemiMonthlyRepaymentScheduleTest}},
> \{{SemiMonthlyScheduleDatesTest}}, \{{LoanSemiMonthlyRepayment.feature}})
> pass unchanged in behaviour.
> ```
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)