Merge remote-tracking branch 'self-hosted/feature/account-charges' into feature/Backend-DSC-MFA

# Conflicts:
#	fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
This commit is contained in:
Aditya
2026-05-20 13:26:58 +05:30
112 changed files with 207214 additions and 46034 deletions
@@ -41,22 +41,36 @@ public interface ClientNomineeRepository extends JpaRepository<ClientNominee, Lo
@Query("SELECT n FROM ClientNominee n WHERE n.client.id = :clientId AND n.accountNo = :accountNo AND n.accountType = :accountType AND n.isDeleted = false ORDER BY n.id")
List<ClientNominee> findByClientIdAndAccountNoAndAccountType(@Param("clientId") Long clientId, @Param("accountNo") String accountNo, @Param("accountType") String accountType);
@Query("SELECT COUNT(n) FROM ClientNominee n WHERE n.accountNo = :accountNo AND n.accountType = :accountType AND n.isDeleted = false")
@Query("SELECT COUNT(n) FROM ClientNominee n WHERE n.accountNo = :accountNo AND n.accountType = :accountType")
long countByAccountNoAndAccountType(@Param("accountNo") String accountNo, @Param("accountType") String accountType);
/**
* Counts non-deleted nominee rows that link {@code nomineeClientId} as a nominee under
* {@code clientId} for the given {@code accountType}. Backs the rule that the same person
* may not be linked as a nominee more than once per (account owner, account type).
* {@code excludeNomineeId} is set on update so a row doesn't conflict with itself.
*/
@Query("SELECT COUNT(n) FROM ClientNominee n "
+ "WHERE n.client.id = :clientId "
+ "AND n.nomineeClient.id = :nomineeClientId "
+ "AND n.accountType = :accountType "
+ "AND n.isDeleted = false")
long countActiveByClientNomineeAndAccountType(@Param("clientId") Long clientId,
@Param("nomineeClientId") Long nomineeClientId,
@Param("accountType") String accountType);
@Query("SELECT COUNT(n) FROM ClientNominee n "
+ "WHERE n.client.id = :clientId "
+ "AND n.nomineeClient.id = :nomineeClientId "
+ "AND n.accountNo = :accountNo "
+ "AND n.accountType = :accountType "
+ "AND n.isDeleted = false")
long countActiveByClientNomineeAndAccountNoAndType(@Param("clientId") Long clientId,
@Param("nomineeClientId") Long nomineeClientId,
@Param("accountNo") String accountNo,
@Param("accountType") String accountType);
@Query("SELECT COUNT(n) FROM ClientNominee n "
+ "WHERE n.client.id = :clientId "
+ "AND n.nomineeClient.id = :nomineeClientId "
+ "AND n.accountType = :accountType "
+ "AND n.isDeleted = false "
+ "AND (:excludeNomineeId IS NULL OR n.id <> :excludeNomineeId)")
long countActiveByClientNomineeAndAccountType(@Param("clientId") Long clientId,
+ "AND n.id <> :excludeNomineeId")
long countActiveByClientNomineeAndAccountTypeExcluding(@Param("clientId") Long clientId,
@Param("nomineeClientId") Long nomineeClientId,
@Param("accountType") String accountType,
@Param("excludeNomineeId") Long excludeNomineeId);
@@ -274,6 +274,46 @@ public final class DepositsApiConstants {
fixedDepositRequestData.addAll(DEPOSIT_PRODUCT_REQUEST_DATA_PARAMETERS);
fixedDepositRequestData.addAll(PRECLOSURE_REQUEST_DATA_PARAMETERS);
fixedDepositRequestData.addAll(DEPOSIT_TERM_REQUEST_DATA_PARAMETERS);
fixedDepositRequestData.add(SavingsApiConstants.minBalanceForInterestCalculationParamName);
fixedDepositRequestData.add("accountType");
fixedDepositRequestData.add("customerSegment");
fixedDepositRequestData.add("productCode");
fixedDepositRequestData.add("fdType");
fixedDepositRequestData.add(SavingsApiConstants.glAccountIdParamName);
fixedDepositRequestData.add("effectiveDate");
fixedDepositRequestData.add("effectiveTo");
fixedDepositRequestData.add("endDate");
fixedDepositRequestData.add("introducerRequired");
fixedDepositRequestData.add("shareLinkingEnabled");
fixedDepositRequestData.add("nominationFacility");
fixedDepositRequestData.add("dormancyAlert");
fixedDepositRequestData.add(SavingsApiConstants.isDormancyTrackingActiveParamName);
fixedDepositRequestData.add(SavingsApiConstants.daysToInactiveParamName);
fixedDepositRequestData.add(SavingsApiConstants.daysToDormancyParamName);
fixedDepositRequestData.add(SavingsApiConstants.daysToEscheatParamName);
fixedDepositRequestData.add("interestCalculateSelector");
fixedDepositRequestData.add("averagePeriod");
fixedDepositRequestData.add("autoPost");
fixedDepositRequestData.add("frequencyFixDay");
fixedDepositRequestData.add("lastInterestDate");
fixedDepositRequestData.add("enableLockinPeriod");
fixedDepositRequestData.add("balanceFrequency");
fixedDepositRequestData.add("accountClosedZeroBalanceInDayClosing");
fixedDepositRequestData.add("autoDebitFacility");
fixedDepositRequestData.add("loanFacility");
fixedDepositRequestData.add("prematureWithdrawalOption");
fixedDepositRequestData.add("tenureFlexibility");
fixedDepositRequestData.add("lienMarked");
fixedDepositRequestData.add("withdrawalFeeForTransfers");
fixedDepositRequestData.add("maturityInstructions");
fixedDepositRequestData.add("creditMaturityProceeds");
fixedDepositRequestData.add("penaltyGracePeriodMissedInstallments");
fixedDepositRequestData.add("panelRequestApplicable");
fixedDepositRequestData.add("noPenaltyNomineeHeirClosure");
fixedDepositRequestData.add("deceasedSettlement");
fixedDepositRequestData.add("allowDebitTxnAfterDueDate");
fixedDepositRequestData.add("escheatLiabilityId");
fixedDepositRequestData.add("fdSlabs");
return fixedDepositRequestData;
}
@@ -282,6 +322,54 @@ public final class DepositsApiConstants {
fixedDepositRequestData.addAll(DEPOSIT_PRODUCT_REQUEST_DATA_PARAMETERS);
fixedDepositRequestData.addAll(PRECLOSURE_RESPONSE_DATA_PARAMETERS);
fixedDepositRequestData.addAll(DEPOSIT_TERM_RESPONSE_DATA_PARAMETERS);
fixedDepositRequestData.add(SavingsApiConstants.minBalanceForInterestCalculationParamName);
fixedDepositRequestData.add("interestCalculationTypeOption");
fixedDepositRequestData.add("periodFrequencyOptions");
fixedDepositRequestData.add("yesNoOptions");
fixedDepositRequestData.add("accountTypeOptions");
fixedDepositRequestData.add("customerSegmentOptions");
fixedDepositRequestData.add("accountType");
fixedDepositRequestData.add("customerSegment");
fixedDepositRequestData.add("productCode");
fixedDepositRequestData.add("fdType");
fixedDepositRequestData.add(SavingsApiConstants.glAccountIdParamName);
fixedDepositRequestData.add("glAccountName");
fixedDepositRequestData.add("effectiveDate");
fixedDepositRequestData.add("effectiveTo");
fixedDepositRequestData.add("endDate");
fixedDepositRequestData.add("introducerRequired");
fixedDepositRequestData.add("shareLinkingEnabled");
fixedDepositRequestData.add("nominationFacility");
fixedDepositRequestData.add("dormancyAlert");
fixedDepositRequestData.add(SavingsApiConstants.isDormancyTrackingActiveParamName);
fixedDepositRequestData.add(SavingsApiConstants.daysToInactiveParamName);
fixedDepositRequestData.add(SavingsApiConstants.daysToDormancyParamName);
fixedDepositRequestData.add(SavingsApiConstants.daysToEscheatParamName);
fixedDepositRequestData.add("interestCalculateSelector");
fixedDepositRequestData.add("averagePeriod");
fixedDepositRequestData.add("autoPost");
fixedDepositRequestData.add("frequencyFixDay");
fixedDepositRequestData.add("lastInterestDate");
fixedDepositRequestData.add("enableLockinPeriod");
fixedDepositRequestData.add("balanceFrequency");
fixedDepositRequestData.add("accountClosedZeroBalanceInDayClosing");
fixedDepositRequestData.add("autoDebitFacility");
fixedDepositRequestData.add("loanFacility");
fixedDepositRequestData.add("prematureWithdrawalOption");
fixedDepositRequestData.add("tenureFlexibility");
fixedDepositRequestData.add("lienMarked");
fixedDepositRequestData.add("withdrawalFeeForTransfers");
fixedDepositRequestData.add("maturityInstructions");
fixedDepositRequestData.add("creditMaturityProceeds");
fixedDepositRequestData.add("penaltyGracePeriodMissedInstallments");
fixedDepositRequestData.add("panelRequestApplicable");
fixedDepositRequestData.add("noPenaltyNomineeHeirClosure");
fixedDepositRequestData.add("deceasedSettlement");
fixedDepositRequestData.add("allowDebitTxnAfterDueDate");
fixedDepositRequestData.add("accountingMappings");
fixedDepositRequestData.add("paymentChannelToFundSourceMappings");
fixedDepositRequestData.add("feeToIncomeAccountMappings");
fixedDepositRequestData.add("penaltyToIncomeAccountMappings");
return fixedDepositRequestData;
}
@@ -332,6 +420,7 @@ public final class DepositsApiConstants {
recurringDepositRequestData.add("deceasedSettlement");
recurringDepositRequestData.add("allowDebitTxnAfterDueDate");
recurringDepositRequestData.add("accountClosedZeroBalanceInDayClosing");
recurringDepositRequestData.add("escheatLiabilityId");
// Custom CBS fields — Interest rate slabs (sent inline but ignored server-side; saved separately)
recurringDepositRequestData.add("rdSlabs");
return recurringDepositRequestData;
@@ -387,6 +476,11 @@ public final class DepositsApiConstants {
recurringDepositRequestData.add("noPenaltyNomineeHeirClosure");
recurringDepositRequestData.add("deceasedSettlement");
recurringDepositRequestData.add("allowDebitTxnAfterDueDate");
recurringDepositRequestData.add("escheatLiabilityId");
recurringDepositRequestData.add("accountingMappings");
recurringDepositRequestData.add("paymentChannelToFundSourceMappings");
recurringDepositRequestData.add("feeToIncomeAccountMappings");
recurringDepositRequestData.add("penaltyToIncomeAccountMappings");
return recurringDepositRequestData;
}
@@ -428,6 +522,28 @@ public final class DepositsApiConstants {
fixedDepositRequestData.addAll(DEPOSIT_TERM_REQUEST_DATA_PARAMETERS);
fixedDepositRequestData.add(linkedAccountParamName);
fixedDepositRequestData.add(transferInterestToSavingsParamName);
fixedDepositRequestData.add("accountType");
fixedDepositRequestData.add("customerSegment");
fixedDepositRequestData.add(SavingsApiConstants.accountStatusParamName);
fixedDepositRequestData.add(SavingsApiConstants.modeOfOperationParamName);
fixedDepositRequestData.add(SavingsApiConstants.specialCategoryParamName);
fixedDepositRequestData.add(SavingsApiConstants.weakerSectionParamName);
fixedDepositRequestData.add(SavingsApiConstants.guardianNameParamName);
fixedDepositRequestData.add(SavingsApiConstants.guardianCifNumberParamName);
fixedDepositRequestData.add(SavingsApiConstants.guardianRelationshipParamName);
fixedDepositRequestData.add(SavingsApiConstants.guardianClientIdParamName);
fixedDepositRequestData.add(SavingsApiConstants.minorDateOfBirthParamName);
fixedDepositRequestData.add(SavingsApiConstants.introducerIdParamName);
fixedDepositRequestData.add(SavingsApiConstants.introducerNameParamName);
fixedDepositRequestData.add(SavingsApiConstants.introducerCifNumberParamName);
fixedDepositRequestData.add(SavingsApiConstants.nomineeParamName);
fixedDepositRequestData.add("nominees");
fixedDepositRequestData.add(SavingsApiConstants.linkedAccountIdParamName);
fixedDepositRequestData.add(SavingsApiConstants.linkedAccountTypeParamName);
fixedDepositRequestData.add(SavingsApiConstants.linkedAccountNoParamName);
fixedDepositRequestData.add(SavingsApiConstants.jointHoldersParamName);
fixedDepositRequestData.add(SavingsApiConstants.autoDebitFacilityParamName);
fixedDepositRequestData.add(SavingsApiConstants.nominationFacilityParamName);
return fixedDepositRequestData;
}
@@ -438,6 +554,31 @@ public final class DepositsApiConstants {
fixedDepositResponseData.addAll(DEPOSIT_TERM_RESPONSE_DATA_PARAMETERS);
fixedDepositResponseData.add(linkedAccountParamName);
fixedDepositResponseData.add(transferInterestToSavingsParamName);
fixedDepositResponseData.add("accountType");
fixedDepositResponseData.add("customerSegment");
fixedDepositResponseData.add("accountTypeOptions");
fixedDepositResponseData.add("customerSegmentOptions");
fixedDepositResponseData.add("productCode");
fixedDepositResponseData.add("previewAccountNo");
fixedDepositResponseData.add(SavingsApiConstants.accountStatusParamName);
fixedDepositResponseData.add(SavingsApiConstants.modeOfOperationParamName);
fixedDepositResponseData.add(SavingsApiConstants.specialCategoryParamName);
fixedDepositResponseData.add(SavingsApiConstants.weakerSectionParamName);
fixedDepositResponseData.add(SavingsApiConstants.guardianNameParamName);
fixedDepositResponseData.add(SavingsApiConstants.guardianCifNumberParamName);
fixedDepositResponseData.add(SavingsApiConstants.guardianRelationshipParamName);
fixedDepositResponseData.add(SavingsApiConstants.guardianClientIdParamName);
fixedDepositResponseData.add(SavingsApiConstants.minorDateOfBirthParamName);
fixedDepositResponseData.add(SavingsApiConstants.introducerIdParamName);
fixedDepositResponseData.add(SavingsApiConstants.introducerNameParamName);
fixedDepositResponseData.add(SavingsApiConstants.introducerCifNumberParamName);
fixedDepositResponseData.add(SavingsApiConstants.nomineeParamName);
fixedDepositResponseData.add(SavingsApiConstants.linkedAccountIdParamName);
fixedDepositResponseData.add(SavingsApiConstants.linkedAccountTypeParamName);
fixedDepositResponseData.add(SavingsApiConstants.linkedAccountNoParamName);
fixedDepositResponseData.add(SavingsApiConstants.jointHoldersParamName);
fixedDepositResponseData.add(SavingsApiConstants.nominationFacilityParamName);
fixedDepositResponseData.add(SavingsApiConstants.autoDebitFacilityParamName);
return fixedDepositResponseData;
}
@@ -447,6 +588,30 @@ public final class DepositsApiConstants {
recurringDepositRequestData.addAll(PRECLOSURE_REQUEST_DATA_PARAMETERS);
recurringDepositRequestData.addAll(DEPOSIT_TERM_REQUEST_DATA_PARAMETERS);
recurringDepositRequestData.addAll(RECURRING_DETAILS_REQUEST_DATA_PARAMETERS);
// CBS Account fields
recurringDepositRequestData.add("accountType");
recurringDepositRequestData.add("customerSegment");
recurringDepositRequestData.add(SavingsApiConstants.accountStatusParamName);
recurringDepositRequestData.add(SavingsApiConstants.modeOfOperationParamName);
recurringDepositRequestData.add(SavingsApiConstants.specialCategoryParamName);
recurringDepositRequestData.add(SavingsApiConstants.weakerSectionParamName);
recurringDepositRequestData.add(SavingsApiConstants.guardianNameParamName);
recurringDepositRequestData.add(SavingsApiConstants.guardianCifNumberParamName);
recurringDepositRequestData.add(SavingsApiConstants.guardianRelationshipParamName);
recurringDepositRequestData.add(SavingsApiConstants.guardianClientIdParamName);
recurringDepositRequestData.add(SavingsApiConstants.minorDateOfBirthParamName);
recurringDepositRequestData.add(SavingsApiConstants.introducerIdParamName);
recurringDepositRequestData.add(SavingsApiConstants.introducerNameParamName);
recurringDepositRequestData.add(SavingsApiConstants.introducerCifNumberParamName);
recurringDepositRequestData.add(SavingsApiConstants.nomineeParamName);
recurringDepositRequestData.add("nominees");
recurringDepositRequestData.add(SavingsApiConstants.linkedAccountIdParamName);
recurringDepositRequestData.add(SavingsApiConstants.linkedAccountTypeParamName);
recurringDepositRequestData.add(SavingsApiConstants.linkedAccountNoParamName);
recurringDepositRequestData.add(SavingsApiConstants.jointHoldersParamName);
recurringDepositRequestData.add(SavingsApiConstants.balanceSwapOptionParamName);
recurringDepositRequestData.add(SavingsApiConstants.msmeParamName);
recurringDepositRequestData.add(SavingsApiConstants.autoDebitFacilityParamName);
return recurringDepositRequestData;
}
@@ -494,6 +659,10 @@ public final class DepositsApiConstants {
recurringDepositResponseData.add("noPenaltyNomineeHeirClosure");
recurringDepositResponseData.add("deceasedSettlement");
recurringDepositResponseData.add("allowDebitTxnAfterDueDate");
recurringDepositResponseData.add("accountingMappings");
recurringDepositResponseData.add("paymentChannelToFundSourceMappings");
recurringDepositResponseData.add("feeToIncomeAccountMappings");
recurringDepositResponseData.add("penaltyToIncomeAccountMappings");
return recurringDepositResponseData;
}
@@ -32,6 +32,8 @@ public class SavingsApiConstants {
public static final String CURRENT_PRODUCT_CUSTOMER_SEGMENT = "CurrentProductCustomerSegment";
public static final String RD_PRODUCT_ACCOUNT_TYPE = "RecurringDepositProductAccountType";
public static final String RD_PRODUCT_CUSTOMER_SEGMENT = "RecurringDepositProductCustomerSegment";
public static final String FD_PRODUCT_ACCOUNT_TYPE = "FixedDepositProductAccountType";
public static final String FD_PRODUCT_CUSTOMER_SEGMENT = "FixedDepositProductCustomerSegment";
public static final String PERIOD_FREQUENCY = "PeriodFrequency";
public static final String INTEREST_CALCULATION_TYPE_OPTION = "InterestCalculationTypeOption";