From 2e3b96df19dfd6195fa7d7e147f8b7cd68240828 Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Thu, 25 May 2023 11:45:08 +0200 Subject: [PATCH] FINERACT-1932: Add loan module (WIP) --- build.gradle | 4 +- .../event/externalevent/dependencies.gradle | 1 + custom/acme/loan/cob/dependencies.gradle | 1 + custom/acme/loan/job/dependencies.gradle | 1 + .../acme/loan/processor/dependencies.gradle | 1 + custom/acme/loan/starter/dependencies.gradle | 1 + fineract-core/build.gradle | 19 +++ .../common/AccountingEnumerations.java | 0 .../accounting/common/AccountingRuleType.java | 0 .../api/GLAccountJsonInputParams.java | 0 .../glaccount/data/GLAccountData.java | 0 .../glaccount/domain/GLAccount.java | 0 .../glaccount/domain/GLAccountUsage.java | 0 .../journalentry/domain/JournalEntryType.java | 0 .../data/ChargeToGLAccountMapper.java | 0 .../data/PaymentTypeToGLAccountMapper.java | 0 .../domain/PortfolioProductType.java | 0 .../apache/fineract/cob/COBBusinessStep.java | 0 .../infrastructure/codes/CodeConstants.java | 0 .../codes/data/CodeValueData.java | 0 .../infrastructure/codes/domain/Code.java | 0 .../codes/domain/CodeValue.java | 0 ...emDefinedCodeCannotBeChangedException.java | 0 ...emporaryConfigurationServiceContainer.java | 0 .../core/domain/AbstractAuditableCustom.java | 0 ...bstractAuditableWithUTCDateTimeCustom.java | 0 .../domain/AbstractPersistableCustom.java | 0 .../core/domain/LocalDateInterval.java | 0 .../AbstractPlatformDomainRuleException.java | 0 ...ractPlatformResourceNotFoundException.java | 0 .../GeneralPlatformDomainRuleException.java | 0 .../PlatformDataIntegrityException.java | 0 .../core/service/SearchParameters.java | 0 .../dataqueries/data/DatatableData.java | 0 .../data/ResultsetColumnHeaderData.java | 0 .../data/ResultsetColumnValueData.java | 0 .../documentmanagement/domain/Image.java | 0 .../domain/StorageType.java | 0 .../exception/NoAuthorizationException.java | 0 .../service/RandomPasswordGenerator.java | 0 .../holiday/api/HolidayApiConstants.java | 0 .../organisation/holiday/domain/Holiday.java | 0 .../holiday/domain/HolidayStatusType.java | 0 .../holiday/domain/RescheduleType.java | 0 .../holiday/service/HolidayUtil.java | 0 .../monetary/data/CurrencyData.java | 0 .../monetary/domain/ApplicationCurrency.java | 0 .../monetary/domain/MonetaryCurrency.java | 0 .../organisation/monetary/domain/Money.java | 0 .../monetary/domain/MoneyHelper.java | 0 .../organisation/office/data/OfficeData.java | 0 .../organisation/office/domain/Office.java | 0 .../office/domain/OrganisationCurrency.java | 0 ...pdateOfficeWithParentOfficeSameAsSelf.java | 0 .../RootOfficeParentCannotBeUpdated.java | 0 .../organisation/staff/data/StaffData.java | 0 .../organisation/staff/domain/Staff.java | 0 .../staff/domain/StaffEnumerations.java | 0 .../domain/StaffOrganisationalRoleType.java | 0 .../api/WorkingDaysApiConstants.java | 0 .../data/AdjustedDateDetailsDTO.java | 0 .../domain/RepaymentRescheduleType.java | 0 .../workingdays/domain/WorkingDays.java | 0 .../domain/WorkingDaysEnumerations.java | 0 .../workingdays/service/WorkingDaysUtil.java | 0 .../account/PortfolioAccountType.java | 0 .../account/data/AccountTransferData.java | 0 .../account/data/PortfolioAccountData.java | 0 .../AccountTransfersReadPlatformService.java | 0 .../data/SavingsAccountSummaryData.java | 0 .../accountdetails/domain/AccountType.java | 0 .../service/AccountEnumerations.java | 0 .../portfolio/address/data/AddressData.java | 0 .../portfolio/calendar/CalendarConstants.java | 0 .../portfolio/calendar/data/CalendarData.java | 0 .../data/CalendarHistoryDataWrapper.java | 0 .../portfolio/calendar/domain/Calendar.java | 0 .../calendar/domain/CalendarEntityType.java | 0 .../domain/CalendarFrequencyType.java | 0 .../calendar/domain/CalendarHistory.java | 0 .../calendar/domain/CalendarInstance.java | 0 .../calendar/domain/CalendarRemindBy.java | 0 .../calendar/domain/CalendarType.java | 0 .../calendar/domain/CalendarWeekDaysType.java | 0 .../exception/CalendarDateException.java | 0 ...rParameterUpdateNotSupportedException.java | 0 .../service/CalendarEnumerations.java | 0 .../calendar/service/CalendarUtils.java | 0 .../charge/api/ChargesApiConstants.java | 0 .../portfolio/charge/data/ChargeData.java | 61 -------- .../portfolio/charge/domain/Charge.java | 0 .../charge/domain/ChargeAppliesTo.java | 0 .../charge/domain/ChargeCalculationType.java | 0 .../charge/domain/ChargePaymentMode.java | 0 .../charge/domain/ChargeTimeType.java | 0 ...tDisbursementCannotBePenaltyException.java | 0 .../ChargeMustBePenaltyException.java | 0 ...eParameterUpdateNotSupportedException.java | 0 .../LoanChargeCannotBeAddedException.java | 0 .../charge/service/ChargeEnumerations.java | 0 .../data/ClientCollateralManagementData.java | 24 +-- .../portfolio/client/data/ClientData.java | 0 .../client/data/ClientFamilyMembersData.java | 0 .../client/data/ClientNonPersonData.java | 0 .../client/data/ClientTimelineData.java | 0 .../portfolio/client/domain/Client.java | 6 - .../portfolio/client/domain/ClientStatus.java | 0 .../portfolio/client/domain/LegalForm.java | 0 .../data/ClientCollateralManagementData.java | 0 .../data/LoanTransactionData.java | 0 .../common/domain/DayOfWeekType.java | 0 .../common/domain/DaysInMonthType.java | 0 .../common/domain/DaysInYearType.java | 0 .../portfolio/common/domain/NthDayType.java | 0 .../common/domain/PeriodFrequencyType.java | 0 .../delinquency/domain/DelinquencyBucket.java | 0 .../delinquency/domain/DelinquencyRange.java | 0 .../floatingrates/data/FloatingRateDTO.java | 0 .../data/FloatingRatePeriodData.java | 0 .../floatingrates/domain/FloatingRate.java | 0 .../domain/FloatingRatePeriod.java | 0 .../fineract/portfolio/fund/domain/Fund.java | 0 .../group/api/GroupingTypesApiConstants.java | 0 .../portfolio/group/data/CenterData.java | 0 .../group/data/GroupGeneralData.java | 0 .../portfolio/group/data/GroupRoleData.java | 0 .../group/data/GroupTimelineData.java | 0 .../portfolio/group/domain/Group.java | 4 - .../portfolio/group/domain/GroupLevel.java | 0 .../portfolio/group/domain/GroupRole.java | 0 .../domain/GroupingTypeEnumerations.java | 0 .../group/domain/GroupingTypeStatus.java | 0 .../group/domain/StaffAssignmentHistory.java | 0 .../ClientExistInGroupException.java | 0 .../exception/ClientNotInGroupException.java | 0 .../GroupExistsInCenterException.java | 0 .../GroupNotExistsInCenterException.java | 0 .../InvalidGroupStateTransitionException.java | 0 .../paymentdetail/PaymentDetailConstants.java | 0 .../paymentdetail/data/PaymentDetailData.java | 0 .../paymentdetail/domain/PaymentDetail.java | 0 .../paymenttype/data/PaymentTypeData.java | 0 .../paymenttype/domain/PaymentType.java | 0 .../fineract/portfolio/rate/domain/Rate.java | 0 .../portfolio/rate/domain/RateAppliesTo.java | 0 .../savings/DepositAccountOnClosureType.java | 2 - .../DepositAccountOnHoldTransactionType.java | 2 - .../portfolio/savings/DepositAccountType.java | 1 - .../PreClosurePenalInterestOnType.java | 0 .../savings/RecurringDepositType.java | 0 .../SavingsAccountTransactionType.java | 2 - .../SavingsCompoundingInterestPeriodType.java | 0 ...ingsInterestCalculationDaysInYearType.java | 0 .../SavingsInterestCalculationType.java | 0 .../savings/SavingsPeriodFrequencyType.java | 0 .../SavingsPostingInterestPeriodType.java | 0 .../savings/SavingsWithdrawalFeesType.java | 0 ...SavingsAccountApplicationTimelineData.java | 0 .../data/SavingsAccountChargeData.java | 0 .../savings/data/SavingsAccountData.java | 6 +- .../data/SavingsAccountStatusEnumData.java | 0 .../data/SavingsAccountSubStatusEnumData.java | 0 .../data/SavingsAccountSummaryData.java | 10 +- .../data/SavingsAccountTransactionData.java | 0 .../SavingsAccountTransactionEnumData.java | 0 ...ingsAccountTransactionToUpdateSummary.java | 44 ++++++ .../savings/data/SavingsProductData.java | 0 .../SavingsAccountChargesPaidByData.java | 0 .../domain/SavingsAccountStatusType.java | 0 .../domain/SavingsAccountSubStatusEnum.java | 0 ...sAccountTransactionDataSummaryWrapper.java | 145 ++++++++++++++++++ .../savings/domain/SavingsHelper.java | 0 .../interest/AnnualCompoundingPeriod.java | 0 .../interest/BiAnnualCompoundingPeriod.java | 0 .../interest/CompoundInterestHelper.java | 0 .../interest/CompoundInterestValues.java | 0 .../domain/interest/CompoundingPeriod.java | 0 .../interest/DailyCompoundingPeriod.java | 0 .../domain/interest/EndOfDayBalance.java | 0 .../interest/MonthlyCompoundingPeriod.java | 0 .../domain/interest/PostingPeriod.java | 7 +- .../interest/QuarterlyCompoundingPeriod.java | 0 ...untTransactionDetailsForPostingPeriod.java | 136 ++++++++++++++++ .../savings/service/SavingsEnumerations.java | 0 .../portfolio/tax/api/TaxApiConstants.java | 0 .../portfolio/tax/data/TaxComponentData.java | 0 .../tax/data/TaxComponentHistoryData.java | 0 .../portfolio/tax/data/TaxDetailsData.java | 0 .../portfolio/tax/data/TaxGroupData.java | 0 .../tax/data/TaxGroupMappingsData.java | 0 .../portfolio/tax/domain/TaxComponent.java | 0 .../tax/domain/TaxComponentHistory.java | 0 .../portfolio/tax/domain/TaxGroup.java | 0 .../tax/domain/TaxGroupMappings.java | 0 .../TaxMappingNotFoundException.java | 0 .../data/PermissionData.java | 0 .../useradministration/data/RoleData.java | 0 .../data/RolePermissionsData.java | 0 .../useradministration/domain/AppUser.java | 0 .../domain/AppUserClientMapping.java | 0 .../useradministration/domain/Permission.java | 0 .../useradministration/domain/Role.java | 0 .../service/AppUserConstants.java | 0 .../main/resources/jpa/core/persistence.xml | 37 +++++ .../en/chapters/custom/business-step.adoc | 4 +- .../custom/loan-transaction-processor.adoc | 4 +- .../diag-28a77b45f78221c5cb0e8f5d27c6b34f.png | Bin 0 -> 8684 bytes .../multiple-batch-instances-diagram.png | Bin 13644 -> 14287 bytes .../multiple-read-instances-diagram.png | Bin 15903 -> 16157 bytes .../en/images/single-instance-diagram.png | Bin 7235 -> 7552 bytes fineract-investor/build.gradle | 2 +- fineract-investor/dependencies.gradle | 1 + ...bstractAuditableWithUTCDateTimeCustom.java | 99 ------------ .../domain/AbstractPersistableCustom.java | 62 -------- .../investor/domain/ExternalAssetOwner.java | 1 + .../domain/ExternalAssetOwnerTransfer.java | 1 + ...ExternalAssetOwnerTransferLoanMapping.java | 1 + .../resources/jpa/investor/persistence.xml | 37 +++++ fineract-loan/build.gradle | 108 +++++++++++++ fineract-loan/dependencies.gradle | 75 +++++++++ .../cob/loan/LoanCOBBusinessStep.java | 0 .../interoperation/util/MathUtil.java | 0 ...nChargeWithoutMandatoryFieldException.java | 0 .../api/CollateralApiConstants.java | 0 .../collateral/data/CollateralData.java | 0 .../collateral/domain/LoanCollateral.java | 0 .../CollateralManagementJsonInputParams.java | 0 .../domain/ClientCollateralManagement.java | 0 .../domain/CollateralManagementDomain.java | 0 .../loanaccount/api/LoanApiConstants.java | 0 .../command/LoanChargeCommand.java | 0 .../loanaccount/data/DisbursementData.java | 0 .../loanaccount/data/HolidayDetailDTO.java | 0 .../loanaccount/data/LoanChargeData.java | 0 .../data/LoanChargePaidByData.java | 0 .../data/LoanChargePaidDetail.java | 0 .../data/LoanCollateralManagementData.java | 0 .../data/LoanInstallmentChargeData.java | 0 .../LoanRepaymentScheduleInstallmentData.java | 0 .../loanaccount/data/LoanStatusEnumData.java | 0 .../data/LoanTermVariationsData.java | 0 .../data/LoanTermVariationsDataWrapper.java | 0 .../loanaccount/data/LoanTransactionData.java | 0 .../data/LoanTransactionEnumData.java | 0 .../data/LoanTransactionRelationData.java | 0 .../data/ScheduleGeneratorDTO.java | 0 .../domain/ChangedTransactionDetail.java | 0 .../GroupLoanIndividualMonitoringAccount.java | 0 .../portfolio/loanaccount/domain/Loan.java | 0 .../loanaccount/domain/LoanCharge.java | 0 .../loanaccount/domain/LoanChargePaidBy.java | 0 .../domain/LoanCollateralManagement.java | 0 .../domain/LoanDisbursementDetails.java | 0 .../loanaccount/domain/LoanEvent.java | 0 .../domain/LoanInstallmentCharge.java | 0 ...nterestRecalcualtionAdditionalDetails.java | 0 .../LoanInterestRecalculationDetails.java | 0 .../domain/LoanLifecycleStateMachine.java | 0 .../domain/LoanOfficerAssignmentHistory.java | 0 .../domain/LoanOverdueInstallmentCharge.java | 0 .../LoanRepaymentScheduleInstallment.java | 0 ...oanRepaymentScheduleProcessingWrapper.java | 0 ...ntScheduleTransactionProcessorFactory.java | 0 .../loanaccount/domain/LoanStatus.java | 0 .../loanaccount/domain/LoanSubStatus.java | 0 .../loanaccount/domain/LoanSummary.java | 0 .../domain/LoanSummaryWrapper.java | 0 .../domain/LoanTermVariationType.java | 0 .../domain/LoanTermVariations.java | 0 .../loanaccount/domain/LoanTopupDetails.java | 0 .../loanaccount/domain/LoanTrancheCharge.java | 0 .../domain/LoanTrancheDisbursementCharge.java | 0 .../loanaccount/domain/LoanTransaction.java | 0 .../domain/LoanTransactionComparator.java | 0 .../domain/LoanTransactionRelation.java | 0 .../LoanTransactionRelationTypeEnum.java | 0 ...TransactionToRepaymentScheduleMapping.java | 0 .../domain/LoanTransactionType.java | 0 ...RepaymentScheduleTransactionProcessor.java | 0 .../ExceedingTrancheCountException.java | 0 .../InvalidLoanStateTransitionException.java | 0 .../InvalidLoanTransactionTypeException.java | 0 .../exception/InvalidRefundDateException.java | 0 .../LoanApplicationDateException.java | 0 .../exception/LoanChargeRefundException.java | 0 .../exception/LoanDisbursalException.java | 0 .../exception/LoanForeclosureException.java | 0 .../LoanOfficerAssignmentDateException.java | 0 .../LoanOfficerAssignmentException.java | 0 .../LoanOfficerUnassignmentDateException.java | 0 ...onProcessingStrategyNotFoundException.java | 0 ...tiDisbursementDataNotAllowedException.java | 0 ...ultiDisbursementDataRequiredException.java | 0 .../UndoLastTrancheDisbursementException.java | 0 .../loanschedule/data/LoanScheduleDTO.java | 0 .../loanschedule/data/LoanScheduleData.java | 0 .../data/LoanSchedulePeriodData.java | 0 .../loanschedule/domain/AprCalculator.java | 0 .../domain/FinanicalFunctions.java | 0 .../domain/LoanApplicationTerms.java | 0 .../domain/LoanScheduleGenerator.java | 0 .../domain/LoanScheduleGeneratorFactory.java | 0 .../domain/LoanScheduleModel.java | 0 .../domain/LoanScheduleModelPeriod.java | 0 .../PaymentPeriodsInOneYearCalculator.java | 0 .../domain/PrincipalInterest.java | 0 .../loanproduct/LoanProductConstants.java | 0 .../TransactionProcessingStrategyData.java | 0 .../domain/AmortizationMethod.java | 0 .../InterestCalculationPeriodMethod.java | 0 .../loanproduct/domain/InterestMethod.java | 0 ...nterestRecalculationCompoundingMethod.java | 0 ...PreClosureInterestCalculationStrategy.java | 0 .../loanproduct/domain/LoanProduct.java | 0 .../LoanProductBorrowerCycleVariations.java | 0 .../LoanProductConfigurableAttributes.java | 0 .../domain/LoanProductFloatingRates.java | 0 .../domain/LoanProductGuaranteeDetails.java | 0 ...anProductInterestRecalculationDetails.java | 0 .../domain/LoanProductMinMaxConstraints.java | 0 ...MinimumRepaymentScheduleRelatedDetail.java | 0 .../domain/LoanProductParamType.java | 0 .../domain/LoanProductRelatedDetail.java | 0 .../domain/LoanProductTrancheDetails.java | 0 .../domain/LoanProductValueConditionType.java | 0 .../LoanProductVariableInstallmentConfig.java | 0 .../domain/LoanRescheduleStrategyMethod.java | 0 .../domain/RecalculationFrequencyType.java | 0 .../LoanProductGeneralRuleException.java | 0 .../loanproduct/service/LoanEnumerations.java | 0 .../domain/PostDatedChecks.java | 0 .../main/resources/jpa/loan/persistence.xml | 75 +++++++++ fineract-loan/src/test/java/.gitkeep | 0 fineract-loan/src/test/resources/.gitkeep | 0 fineract-provider/dependencies.gradle | 1 + .../core/auditing/CustomAuditingHandler.java | 3 +- ...ConvertChargeDataToSpecificChargeData.java | 94 ++++++++++++ .../ClientReadPlatformServiceImpl.java | 6 +- .../loanaccount/data/LoanAccountData.java | 5 +- .../savings/domain/FixedDepositAccount.java | 12 +- .../domain/RecurringDepositAccount.java | 12 +- .../savings/domain/SavingsAccount.java | 21 ++- .../domain/SavingsAccountAssembler.java | 7 +- .../domain/SavingsAccountTransaction.java | 8 + ...vingsAccountTransactionSummaryWrapper.java | 112 -------------- ...DepositAccountReadPlatformServiceImpl.java | 3 +- ...SavingsAccountReadPlatformServiceImpl.java | 3 +- .../ShareAccountReadPlatformServiceImpl.java | 3 +- .../src/main/resources/jpa/persistence.xml | 73 +++++++++ fineract-war/build.gradle | 1 + integration-tests/dependencies.gradle | 1 + settings.gradle | 1 + 352 files changed, 938 insertions(+), 413 deletions(-) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/common/AccountingEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/common/AccountingRuleType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountJsonInputParams.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/glaccount/data/GLAccountData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccount.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountUsage.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntryType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeToGLAccountMapper.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/PaymentTypeToGLAccountMapper.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/domain/PortfolioProductType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/cob/COBBusinessStep.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/codes/CodeConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/codes/domain/Code.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/codes/domain/CodeValue.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/codes/exception/SystemDefinedCodeCannotBeChangedException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/configuration/service/TemporaryConfigurationServiceContainer.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableWithUTCDateTimeCustom.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/domain/LocalDateInterval.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformDomainRuleException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformResourceNotFoundException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/exception/GeneralPlatformDomainRuleException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/exception/PlatformDataIntegrityException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DatatableData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnValueData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/Image.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/StorageType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/security/exception/NoAuthorizationException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/infrastructure/security/service/RandomPasswordGenerator.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/holiday/api/HolidayApiConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/holiday/domain/Holiday.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/holiday/domain/HolidayStatusType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/holiday/domain/RescheduleType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayUtil.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrency.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/monetary/domain/MonetaryCurrency.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/monetary/domain/Money.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/monetary/domain/MoneyHelper.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/office/domain/Office.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/office/domain/OrganisationCurrency.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/office/exception/CannotUpdateOfficeWithParentOfficeSameAsSelf.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/office/exception/RootOfficeParentCannotBeUpdated.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/staff/domain/StaffEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/staff/domain/StaffOrganisationalRoleType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/workingdays/data/AdjustedDateDetailsDTO.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/workingdays/domain/RepaymentRescheduleType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDaysEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysUtil.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/account/PortfolioAccountType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/account/data/PortfolioAccountData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformService.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/accountdetails/data/SavingsAccountSummaryData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/accountdetails/domain/AccountType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/CalendarConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarHistoryDataWrapper.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarEntityType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarFrequencyType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarRemindBy.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarWeekDaysType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarDateException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarParameterUpdateNotSupportedException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/data/ChargeData.java (85%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeAppliesTo.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeCalculationType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargePaymentMode.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeDueAtDisbursementCannotBePenaltyException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeMustBePenaltyException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeParameterUpdateNotSupportedException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeCannotBeAddedException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/data/ClientCollateralManagementData.java (53%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/data/ClientFamilyMembersData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/data/ClientNonPersonData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/data/ClientTimelineData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java (98%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/domain/ClientStatus.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralManagementData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/LoanTransactionData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/common/domain/DayOfWeekType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInMonthType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/common/domain/NthDayType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/common/domain/PeriodFrequencyType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyBucket.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyRange.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRateDTO.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRatePeriodData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/fund/domain/Fund.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/api/GroupingTypesApiConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/data/CenterData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/data/GroupGeneralData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/data/GroupRoleData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/data/GroupTimelineData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java (99%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/domain/GroupLevel.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/domain/GroupRole.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeStatus.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/domain/StaffAssignmentHistory.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/exception/ClientExistInGroupException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/exception/ClientNotInGroupException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/exception/GroupExistsInCenterException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/exception/GroupNotExistsInCenterException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/group/exception/InvalidGroupStateTransitionException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/paymentdetail/PaymentDetailConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/paymentdetail/data/PaymentDetailData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/paymenttype/data/PaymentTypeData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/rate/domain/Rate.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/rate/domain/RateAppliesTo.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnClosureType.java (96%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnHoldTransactionType.java (97%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountType.java (98%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/PreClosurePenalInterestOnType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/RecurringDepositType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java (99%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/SavingsCompoundingInterestPeriodType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationDaysInYearType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/SavingsPeriodFrequencyType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/SavingsPostingInterestPeriodType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/SavingsWithdrawalFeesType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountApplicationTimelineData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountChargeData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java (99%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSubStatusEnumData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java (97%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java (100%) create mode 100644 fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionToUpdateSummary.java rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargesPaidByData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountStatusType.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSubStatusEnum.java (100%) create mode 100644 fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionDataSummaryWrapper.java rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/BiAnnualCompoundingPeriod.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestHelper.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestValues.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundingPeriod.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/DailyCompoundingPeriod.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/EndOfDayBalance.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/MonthlyCompoundingPeriod.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java (98%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/QuarterlyCompoundingPeriod.java (100%) create mode 100644 fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/SavingsAccountTransactionDetailsForPostingPeriod.java rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/api/TaxApiConstants.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentHistoryData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/data/TaxDetailsData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupMappingsData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponentHistory.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroup.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroupMappings.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/portfolio/tax/exception/TaxMappingNotFoundException.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/data/PermissionData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/data/RoleData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/data/RolePermissionsData.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/domain/Permission.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/domain/Role.java (100%) rename {fineract-provider => fineract-core}/src/main/java/org/apache/fineract/useradministration/service/AppUserConstants.java (100%) create mode 100644 fineract-core/src/main/resources/jpa/core/persistence.xml create mode 100644 fineract-doc/src/docs/en/images/diag-28a77b45f78221c5cb0e8f5d27c6b34f.png delete mode 100644 fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractAuditableWithUTCDateTimeCustom.java delete mode 100644 fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractPersistableCustom.java create mode 100644 fineract-loan/build.gradle create mode 100644 fineract-loan/dependencies.gradle rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/cob/loan/LoanCOBBusinessStep.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/interoperation/util/MathUtil.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeWithoutMandatoryFieldException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralApiConstants.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/collateral/data/CollateralData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/collateral/domain/LoanCollateral.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementJsonInputParams.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/ClientCollateralManagement.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/command/LoanChargeCommand.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/DisbursementData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/HolidayDetailDTO.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargeData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidByData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidDetail.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanCollateralManagementData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanInstallmentChargeData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanRepaymentScheduleInstallmentData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanStatusEnumData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsDataWrapper.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionRelationData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/data/ScheduleGeneratorDTO.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/ChangedTransactionDetail.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/GroupLoanIndividualMonitoringAccount.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargePaidBy.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanDisbursementDetails.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanEvent.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalcualtionAdditionalDetails.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanLifecycleStateMachine.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOfficerAssignmentHistory.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOverdueInstallmentCharge.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleTransactionProcessorFactory.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanStatus.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSubStatus.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariationType.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionComparator.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelation.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelationTypeEnum.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/ExceedingTrancheCountException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanStateTransitionException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanTransactionTypeException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidRefundDateException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanApplicationDateException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanChargeRefundException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanDisbursalException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanForeclosureException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentDateException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerUnassignmentDateException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanTransactionProcessingStrategyNotFoundException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataNotAllowedException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataRequiredException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/UndoLastTrancheDisbursementException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleDTO.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AprCalculator.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FinanicalFunctions.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGenerator.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGeneratorFactory.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelPeriod.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PrincipalInterest.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/data/TransactionProcessingStrategyData.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AmortizationMethod.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestMethod.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestRecalculationCompoundingMethod.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanPreClosureInterestCalculationStrategy.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinMaxConstraints.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductParamType.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRelatedDetail.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductValueConditionType.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanRescheduleStrategyMethod.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/RecalculationFrequencyType.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductGeneralRuleException.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java (100%) rename {fineract-provider => fineract-loan}/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/domain/PostDatedChecks.java (100%) create mode 100644 fineract-loan/src/main/resources/jpa/loan/persistence.xml create mode 100644 fineract-loan/src/test/java/.gitkeep create mode 100644 fineract-loan/src/test/resources/.gitkeep create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/util/ConvertChargeDataToSpecificChargeData.java diff --git a/build.gradle b/build.gradle index 856217886..cf6a56916 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,7 @@ buildscript { 'fineract-core', 'fineract-provider', 'fineract-investor', + 'fineract-loan', 'integration-tests', 'twofactor-tests', 'oauth2-tests', @@ -42,7 +43,8 @@ buildscript { 'fineract-avro-schemas', 'fineract-client', 'fineract-provider', - 'fineract-investor' + 'fineract-investor', + 'fineract-loan' ].contains(it.name) } npmRepository = 'https://npm.pkg.github.com' diff --git a/custom/acme/event/externalevent/dependencies.gradle b/custom/acme/event/externalevent/dependencies.gradle index b020fa967..8ca9727e6 100644 --- a/custom/acme/event/externalevent/dependencies.gradle +++ b/custom/acme/event/externalevent/dependencies.gradle @@ -19,6 +19,7 @@ dependencies { implementation(project(':fineract-core')) + implementation(project(':fineract-loan')) implementation(project(':fineract-provider')) implementation('org.springframework.boot:spring-boot-starter-data-jpa') } diff --git a/custom/acme/loan/cob/dependencies.gradle b/custom/acme/loan/cob/dependencies.gradle index b020fa967..8ca9727e6 100644 --- a/custom/acme/loan/cob/dependencies.gradle +++ b/custom/acme/loan/cob/dependencies.gradle @@ -19,6 +19,7 @@ dependencies { implementation(project(':fineract-core')) + implementation(project(':fineract-loan')) implementation(project(':fineract-provider')) implementation('org.springframework.boot:spring-boot-starter-data-jpa') } diff --git a/custom/acme/loan/job/dependencies.gradle b/custom/acme/loan/job/dependencies.gradle index b77475517..60b496193 100644 --- a/custom/acme/loan/job/dependencies.gradle +++ b/custom/acme/loan/job/dependencies.gradle @@ -19,6 +19,7 @@ dependencies { implementation(project(':fineract-core')) + implementation(project(':fineract-loan')) implementation(project(':fineract-provider')) implementation('org.springframework.batch:spring-batch-integration') implementation('org.springframework.boot:spring-boot-starter-data-jpa') diff --git a/custom/acme/loan/processor/dependencies.gradle b/custom/acme/loan/processor/dependencies.gradle index edd2e139b..5db9e6b15 100644 --- a/custom/acme/loan/processor/dependencies.gradle +++ b/custom/acme/loan/processor/dependencies.gradle @@ -19,5 +19,6 @@ dependencies { implementation(project(':fineract-core')) + implementation(project(':fineract-loan')) implementation(project(':fineract-provider')) } diff --git a/custom/acme/loan/starter/dependencies.gradle b/custom/acme/loan/starter/dependencies.gradle index 1f134d647..9832dd16f 100644 --- a/custom/acme/loan/starter/dependencies.gradle +++ b/custom/acme/loan/starter/dependencies.gradle @@ -19,6 +19,7 @@ dependencies { implementation(project(':fineract-core')) + implementation(project(':fineract-loan')) implementation(project(':fineract-provider')) implementation(project(':custom:acme:loan:cob')) implementation(project(':custom:acme:loan:processor')) diff --git a/fineract-core/build.gradle b/fineract-core/build.gradle index f725dc284..14ffa8653 100644 --- a/fineract-core/build.gradle +++ b/fineract-core/build.gradle @@ -22,6 +22,25 @@ apply plugin: 'java' apply plugin: 'eclipse' check.dependsOn('cucumber') +compileJava.doLast { + def mainSS = sourceSets.main + def source = mainSS.java.classesDirectory.get() + copy { + from file("src/main/resources/jpa/core/persistence.xml") + into "${source}/META-INF/" + } + javaexec { + description = 'Performs EclipseLink static weaving of entity classes' + def target = source + main 'org.eclipse.persistence.tools.weaving.jpa.StaticWeave' + args '-persistenceinfo', source, '-classpath', sourceSets.main.runtimeClasspath, source, target + classpath sourceSets.main.runtimeClasspath + } + delete { + delete "${source}/META-INF/persistence.xml" + } +} + configurations { providedRuntime // needed for Spring Boot executable WAR providedCompile diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/common/AccountingEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/accounting/common/AccountingEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/common/AccountingEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/common/AccountingEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/common/AccountingRuleType.java b/fineract-core/src/main/java/org/apache/fineract/accounting/common/AccountingRuleType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/common/AccountingRuleType.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/common/AccountingRuleType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountJsonInputParams.java b/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountJsonInputParams.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountJsonInputParams.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountJsonInputParams.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/data/GLAccountData.java b/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/data/GLAccountData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/data/GLAccountData.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/data/GLAccountData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccount.java b/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccount.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccount.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccount.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountUsage.java b/fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountUsage.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountUsage.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/glaccount/domain/GLAccountUsage.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntryType.java b/fineract-core/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntryType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntryType.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/journalentry/domain/JournalEntryType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeToGLAccountMapper.java b/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeToGLAccountMapper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeToGLAccountMapper.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/ChargeToGLAccountMapper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/PaymentTypeToGLAccountMapper.java b/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/PaymentTypeToGLAccountMapper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/PaymentTypeToGLAccountMapper.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/data/PaymentTypeToGLAccountMapper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/domain/PortfolioProductType.java b/fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/domain/PortfolioProductType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/domain/PortfolioProductType.java rename to fineract-core/src/main/java/org/apache/fineract/accounting/producttoaccountmapping/domain/PortfolioProductType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStep.java b/fineract-core/src/main/java/org/apache/fineract/cob/COBBusinessStep.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStep.java rename to fineract-core/src/main/java/org/apache/fineract/cob/COBBusinessStep.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/CodeConstants.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/CodeConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/CodeConstants.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/CodeConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/data/CodeValueData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/domain/Code.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/domain/Code.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/domain/Code.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/domain/Code.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/domain/CodeValue.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/domain/CodeValue.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/domain/CodeValue.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/domain/CodeValue.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/exception/SystemDefinedCodeCannotBeChangedException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/exception/SystemDefinedCodeCannotBeChangedException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/exception/SystemDefinedCodeCannotBeChangedException.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/codes/exception/SystemDefinedCodeCannotBeChangedException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/service/TemporaryConfigurationServiceContainer.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/configuration/service/TemporaryConfigurationServiceContainer.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/service/TemporaryConfigurationServiceContainer.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/configuration/service/TemporaryConfigurationServiceContainer.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableCustom.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableWithUTCDateTimeCustom.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableWithUTCDateTimeCustom.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableWithUTCDateTimeCustom.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractAuditableWithUTCDateTimeCustom.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/AbstractPersistableCustom.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/LocalDateInterval.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/LocalDateInterval.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/LocalDateInterval.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/domain/LocalDateInterval.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformDomainRuleException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformDomainRuleException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformDomainRuleException.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformDomainRuleException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformResourceNotFoundException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformResourceNotFoundException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformResourceNotFoundException.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/AbstractPlatformResourceNotFoundException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/GeneralPlatformDomainRuleException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/GeneralPlatformDomainRuleException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/GeneralPlatformDomainRuleException.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/GeneralPlatformDomainRuleException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/PlatformDataIntegrityException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/PlatformDataIntegrityException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/exception/PlatformDataIntegrityException.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exception/PlatformDataIntegrityException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/SearchParameters.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DatatableData.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DatatableData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DatatableData.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/DatatableData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnValueData.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnValueData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnValueData.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnValueData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/Image.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/Image.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/Image.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/Image.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/StorageType.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/StorageType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/StorageType.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/documentmanagement/domain/StorageType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/exception/NoAuthorizationException.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/exception/NoAuthorizationException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/exception/NoAuthorizationException.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/security/exception/NoAuthorizationException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/RandomPasswordGenerator.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/security/service/RandomPasswordGenerator.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/service/RandomPasswordGenerator.java rename to fineract-core/src/main/java/org/apache/fineract/infrastructure/security/service/RandomPasswordGenerator.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidayApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/organisation/holiday/api/HolidayApiConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidayApiConstants.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/holiday/api/HolidayApiConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/domain/Holiday.java b/fineract-core/src/main/java/org/apache/fineract/organisation/holiday/domain/Holiday.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/domain/Holiday.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/holiday/domain/Holiday.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/domain/HolidayStatusType.java b/fineract-core/src/main/java/org/apache/fineract/organisation/holiday/domain/HolidayStatusType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/domain/HolidayStatusType.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/holiday/domain/HolidayStatusType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/domain/RescheduleType.java b/fineract-core/src/main/java/org/apache/fineract/organisation/holiday/domain/RescheduleType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/domain/RescheduleType.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/holiday/domain/RescheduleType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayUtil.java b/fineract-core/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayUtil.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayUtil.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayUtil.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/monetary/data/CurrencyData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrency.java b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrency.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrency.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/ApplicationCurrency.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/MonetaryCurrency.java b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/MonetaryCurrency.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/MonetaryCurrency.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/MonetaryCurrency.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/Money.java b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/Money.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/Money.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/Money.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/MoneyHelper.java b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/MoneyHelper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/domain/MoneyHelper.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/monetary/domain/MoneyHelper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java b/fineract-core/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/office/data/OfficeData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java b/fineract-core/src/main/java/org/apache/fineract/organisation/office/domain/Office.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/Office.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/office/domain/Office.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OrganisationCurrency.java b/fineract-core/src/main/java/org/apache/fineract/organisation/office/domain/OrganisationCurrency.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/office/domain/OrganisationCurrency.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/office/domain/OrganisationCurrency.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/exception/CannotUpdateOfficeWithParentOfficeSameAsSelf.java b/fineract-core/src/main/java/org/apache/fineract/organisation/office/exception/CannotUpdateOfficeWithParentOfficeSameAsSelf.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/office/exception/CannotUpdateOfficeWithParentOfficeSameAsSelf.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/office/exception/CannotUpdateOfficeWithParentOfficeSameAsSelf.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/exception/RootOfficeParentCannotBeUpdated.java b/fineract-core/src/main/java/org/apache/fineract/organisation/office/exception/RootOfficeParentCannotBeUpdated.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/office/exception/RootOfficeParentCannotBeUpdated.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/office/exception/RootOfficeParentCannotBeUpdated.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java b/fineract-core/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/staff/data/StaffData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java b/fineract-core/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/staff/domain/Staff.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/StaffEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/organisation/staff/domain/StaffEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/StaffEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/staff/domain/StaffEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/StaffOrganisationalRoleType.java b/fineract-core/src/main/java/org/apache/fineract/organisation/staff/domain/StaffOrganisationalRoleType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/staff/domain/StaffOrganisationalRoleType.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/staff/domain/StaffOrganisationalRoleType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiConstants.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/data/AdjustedDateDetailsDTO.java b/fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/data/AdjustedDateDetailsDTO.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/data/AdjustedDateDetailsDTO.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/data/AdjustedDateDetailsDTO.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/RepaymentRescheduleType.java b/fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/domain/RepaymentRescheduleType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/RepaymentRescheduleType.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/domain/RepaymentRescheduleType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java b/fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDays.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDaysEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDaysEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDaysEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/domain/WorkingDaysEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysUtil.java b/fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysUtil.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysUtil.java rename to fineract-core/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysUtil.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/PortfolioAccountType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/PortfolioAccountType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/account/PortfolioAccountType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/account/PortfolioAccountType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/AccountTransferData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/data/PortfolioAccountData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/PortfolioAccountData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/account/data/PortfolioAccountData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/account/data/PortfolioAccountData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformService.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformService.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformService.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/account/service/AccountTransfersReadPlatformService.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/data/SavingsAccountSummaryData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/accountdetails/data/SavingsAccountSummaryData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/data/SavingsAccountSummaryData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/accountdetails/data/SavingsAccountSummaryData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/domain/AccountType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/accountdetails/domain/AccountType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/domain/AccountType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/accountdetails/domain/AccountType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/accountdetails/service/AccountEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/CalendarConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/CalendarConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/CalendarConstants.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/CalendarConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarHistoryDataWrapper.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarHistoryDataWrapper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarHistoryDataWrapper.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/data/CalendarHistoryDataWrapper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/Calendar.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarEntityType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarEntityType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarEntityType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarEntityType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarFrequencyType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarFrequencyType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarFrequencyType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarFrequencyType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarHistory.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarInstance.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarRemindBy.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarRemindBy.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarRemindBy.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarRemindBy.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarWeekDaysType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarWeekDaysType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarWeekDaysType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/domain/CalendarWeekDaysType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarDateException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarDateException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarDateException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarDateException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarParameterUpdateNotSupportedException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarParameterUpdateNotSupportedException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarParameterUpdateNotSupportedException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/exception/CalendarParameterUpdateNotSupportedException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiConstants.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/data/ChargeData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/data/ChargeData.java similarity index 85% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/data/ChargeData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/data/ChargeData.java index a018cc604..8696e2d6a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/data/ChargeData.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/data/ChargeData.java @@ -20,7 +20,6 @@ package org.apache.fineract.portfolio.charge.data; import java.io.Serializable; import java.math.BigDecimal; -import java.time.LocalDate; import java.time.MonthDay; import java.util.Collection; import java.util.List; @@ -28,13 +27,9 @@ import java.util.Map; import lombok.Getter; import org.apache.fineract.accounting.glaccount.data.GLAccountData; import org.apache.fineract.infrastructure.core.data.EnumOptionData; -import org.apache.fineract.infrastructure.core.domain.ExternalId; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.charge.domain.ChargeTimeType; -import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData; import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData; -import org.apache.fineract.portfolio.savings.data.SavingsAccountChargeData; -import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountChargeData; import org.apache.fineract.portfolio.tax.data.TaxGroupData; /** @@ -301,62 +296,6 @@ public final class ChargeData implements Comparable, Serializable { return obj.id.compareTo(this.id); } - public LoanChargeData toLoanChargeData() { - - BigDecimal percentage = null; - if (this.chargeCalculationType.getId() == 2) { - percentage = this.amount; - } - - return LoanChargeData.newLoanChargeDetails(this.id, this.name, this.currency, this.amount, percentage, this.chargeTimeType, - this.chargeCalculationType, this.penalty, this.chargePaymentMode, this.minCap, this.maxCap, ExternalId.empty()); - } - - public SavingsAccountChargeData toSavingsAccountChargeData() { - - final Long savingsChargeId = null; - final Long savingsAccountId = null; - final BigDecimal amountPaid = BigDecimal.ZERO; - final BigDecimal amountWaived = BigDecimal.ZERO; - final BigDecimal amountWrittenOff = BigDecimal.ZERO; - final BigDecimal amountOutstanding = BigDecimal.ZERO; - final BigDecimal percentage = BigDecimal.ZERO; - final BigDecimal amountPercentageAppliedTo = BigDecimal.ZERO; - final Collection chargeOptions = null; - final LocalDate dueAsOfDate = null; - final Boolean isActive = null; - final Boolean isFreeWithdrawal = null; - final Integer freeWithdrawalChargeFrequency = null; - final Integer restartFrequency = null; - final Integer restartFrequencyEnum = null; - - final LocalDate inactivationDate = null; - - return SavingsAccountChargeData.instance(savingsChargeId, this.id, savingsAccountId, this.name, this.currency, this.amount, - amountPaid, amountWaived, amountWrittenOff, amountOutstanding, this.chargeTimeType, dueAsOfDate, this.chargeCalculationType, - percentage, amountPercentageAppliedTo, chargeOptions, this.penalty, this.feeOnMonthDay, this.feeInterval, isActive, - isFreeWithdrawal, freeWithdrawalChargeFrequency, restartFrequency, restartFrequencyEnum, inactivationDate); - } - - public ShareAccountChargeData toShareAccountChargeData() { - - final Long shareChargeId = null; - final Long shareAccountId = null; - final BigDecimal amountPaid = BigDecimal.ZERO; - final BigDecimal amountWaived = BigDecimal.ZERO; - final BigDecimal amountWrittenOff = BigDecimal.ZERO; - final BigDecimal amountOutstanding = BigDecimal.ZERO; - final BigDecimal percentage = BigDecimal.ZERO; - final BigDecimal amountPercentageAppliedTo = BigDecimal.ZERO; - final Collection chargeOptions = null; - final Boolean isActive = null; - final BigDecimal chargeAmountOrPercentage = BigDecimal.ZERO; - - return new ShareAccountChargeData(shareChargeId, this.id, shareAccountId, this.name, this.currency, this.amount, amountPaid, - amountWaived, amountWrittenOff, amountOutstanding, this.chargeTimeType, this.chargeCalculationType, percentage, - amountPercentageAppliedTo, chargeOptions, isActive, chargeAmountOrPercentage); - } - public boolean isOverdueInstallmentCharge() { boolean isOverdueInstallmentCharge = false; if (this.chargeTimeType != null) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/Charge.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeAppliesTo.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeAppliesTo.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeAppliesTo.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeAppliesTo.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeCalculationType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeCalculationType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeCalculationType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeCalculationType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargePaymentMode.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargePaymentMode.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargePaymentMode.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargePaymentMode.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeDueAtDisbursementCannotBePenaltyException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeDueAtDisbursementCannotBePenaltyException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeDueAtDisbursementCannotBePenaltyException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeDueAtDisbursementCannotBePenaltyException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeMustBePenaltyException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeMustBePenaltyException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeMustBePenaltyException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeMustBePenaltyException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeParameterUpdateNotSupportedException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeParameterUpdateNotSupportedException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeParameterUpdateNotSupportedException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/ChargeParameterUpdateNotSupportedException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeCannotBeAddedException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeCannotBeAddedException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeCannotBeAddedException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeCannotBeAddedException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientCollateralManagementData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientCollateralManagementData.java similarity index 53% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientCollateralManagementData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientCollateralManagementData.java index a6f51225f..e0f58d4ba 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientCollateralManagementData.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientCollateralManagementData.java @@ -21,34 +21,18 @@ package org.apache.fineract.portfolio.client.data; import java.io.Serializable; import java.math.BigDecimal; import lombok.Getter; -import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement; +import lombok.RequiredArgsConstructor; @Getter +@RequiredArgsConstructor public final class ClientCollateralManagementData implements Serializable { - private final BigDecimal quantity; private final Long id; + private final String name; + private final BigDecimal quantity; private final BigDecimal pctToBase; private final BigDecimal unitPrice; private final BigDecimal total; private final BigDecimal totalCollateral; - private final String name; - private ClientCollateralManagementData(final BigDecimal quantity, final Long id, final BigDecimal pctToBase, final BigDecimal unitPrice, - final BigDecimal total, final BigDecimal totalCollateral, final String name) { - this.id = id; - this.pctToBase = pctToBase; - this.total = total; - this.totalCollateral = totalCollateral; - this.unitPrice = unitPrice; - this.quantity = quantity; - this.name = name; - } - - public static ClientCollateralManagementData setCollateralValues(final ClientCollateralManagement clientCollateralManagements, - final BigDecimal total, final BigDecimal totalCollateral) { - return new ClientCollateralManagementData(clientCollateralManagements.getQuantity(), clientCollateralManagements.getId(), - clientCollateralManagements.getCollaterals().getPctToBase(), clientCollateralManagements.getCollaterals().getBasePrice(), - total, totalCollateral, clientCollateralManagements.getCollaterals().getName()); - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientFamilyMembersData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientFamilyMembersData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientFamilyMembersData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientFamilyMembersData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientNonPersonData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientNonPersonData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientNonPersonData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientNonPersonData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientTimelineData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientTimelineData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientTimelineData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/data/ClientTimelineData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java similarity index 98% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java index 6cca1cc6a..1e913b82c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java @@ -24,7 +24,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; @@ -32,7 +31,6 @@ import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Transient; @@ -52,7 +50,6 @@ import org.apache.fineract.infrastructure.security.service.RandomPasswordGenerat import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.portfolio.client.api.ClientApiConstants; -import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement; import org.apache.fineract.portfolio.group.domain.Group; import org.apache.fineract.useradministration.domain.AppUser; @@ -223,9 +220,6 @@ public class Client extends AbstractAuditableWithUTCDateTimeCustom { @Column(name = "proposed_transfer_date") private LocalDate proposedTransferDate; - @OneToMany(mappedBy = "client", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) - private Set clientCollateralManagements = new HashSet<>(); - public static Client instance(final AppUser currentUser, final ClientStatus status, final Office office, final Group clientParentGroup, final String accountNo, final String firstname, final String middlename, final String lastname, final String fullname, final LocalDate activationDate, final LocalDate officeJoiningDate, final ExternalId externalId, final String mobileNo, diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientStatus.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/ClientStatus.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientStatus.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/ClientStatus.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralManagementData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralManagementData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralManagementData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralManagementData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/LoanTransactionData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/LoanTransactionData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/LoanTransactionData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/LoanTransactionData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/DayOfWeekType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DayOfWeekType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/DayOfWeekType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DayOfWeekType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInMonthType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInMonthType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInMonthType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInMonthType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/DaysInYearType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/NthDayType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/NthDayType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/NthDayType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/NthDayType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/PeriodFrequencyType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/PeriodFrequencyType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/common/domain/PeriodFrequencyType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/common/domain/PeriodFrequencyType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyBucket.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyBucket.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyBucket.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyBucket.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyRange.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyRange.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyRange.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/delinquency/domain/DelinquencyRange.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRateDTO.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRateDTO.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRateDTO.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRateDTO.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRatePeriodData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRatePeriodData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRatePeriodData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/data/FloatingRatePeriodData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRate.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/floatingrates/domain/FloatingRatePeriod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/domain/Fund.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/fund/domain/Fund.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/domain/Fund.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/fund/domain/Fund.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupingTypesApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/api/GroupingTypesApiConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupingTypesApiConstants.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/api/GroupingTypesApiConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/CenterData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/CenterData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/CenterData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/CenterData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/GroupGeneralData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/GroupGeneralData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/GroupGeneralData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/GroupGeneralData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/GroupRoleData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/GroupRoleData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/GroupRoleData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/GroupRoleData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/GroupTimelineData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/GroupTimelineData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/data/GroupTimelineData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/data/GroupTimelineData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java similarity index 99% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java index 991ce4ba7..f44341149 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java @@ -54,7 +54,6 @@ import org.apache.fineract.portfolio.group.exception.ClientNotInGroupException; import org.apache.fineract.portfolio.group.exception.GroupExistsInCenterException; import org.apache.fineract.portfolio.group.exception.GroupNotExistsInCenterException; import org.apache.fineract.portfolio.group.exception.InvalidGroupStateTransitionException; -import org.apache.fineract.portfolio.loanaccount.domain.GroupLoanIndividualMonitoringAccount; import org.apache.fineract.useradministration.domain.AppUser; @Entity @@ -137,9 +136,6 @@ public final class Group extends AbstractPersistableCustom { @OneToMany(mappedBy = "group", cascade = CascadeType.REMOVE) private Set groupRole; - @OneToMany(mappedBy = "group") - private List glimLoan; - // JPA default constructor for entity Group() { this.name = null; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupLevel.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupLevel.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupLevel.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupLevel.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupRole.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupRole.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupRole.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupRole.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeStatus.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeStatus.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeStatus.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/GroupingTypeStatus.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/StaffAssignmentHistory.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/StaffAssignmentHistory.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/StaffAssignmentHistory.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/domain/StaffAssignmentHistory.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/ClientExistInGroupException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/ClientExistInGroupException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/ClientExistInGroupException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/ClientExistInGroupException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/ClientNotInGroupException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/ClientNotInGroupException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/ClientNotInGroupException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/ClientNotInGroupException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/GroupExistsInCenterException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/GroupExistsInCenterException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/GroupExistsInCenterException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/GroupExistsInCenterException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/GroupNotExistsInCenterException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/GroupNotExistsInCenterException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/GroupNotExistsInCenterException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/GroupNotExistsInCenterException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/InvalidGroupStateTransitionException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/InvalidGroupStateTransitionException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/group/exception/InvalidGroupStateTransitionException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/group/exception/InvalidGroupStateTransitionException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/PaymentDetailConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymentdetail/PaymentDetailConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/PaymentDetailConstants.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/paymentdetail/PaymentDetailConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/data/PaymentDetailData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymentdetail/data/PaymentDetailData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/data/PaymentDetailData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/paymentdetail/data/PaymentDetailData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/paymentdetail/domain/PaymentDetail.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/data/PaymentTypeData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/data/PaymentTypeData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/data/PaymentTypeData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/data/PaymentTypeData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/paymenttype/domain/PaymentType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/domain/Rate.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/rate/domain/Rate.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/domain/Rate.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/rate/domain/Rate.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/domain/RateAppliesTo.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/rate/domain/RateAppliesTo.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/rate/domain/RateAppliesTo.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/rate/domain/RateAppliesTo.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnClosureType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnClosureType.java similarity index 96% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnClosureType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnClosureType.java index 72c5e4c41..aded4a028 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnClosureType.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnClosureType.java @@ -20,8 +20,6 @@ package org.apache.fineract.portfolio.savings; import java.util.ArrayList; import java.util.List; -import org.apache.fineract.portfolio.savings.domain.FixedDepositAccount; -import org.apache.fineract.portfolio.savings.domain.RecurringDepositAccount; /** * An enumeration of different options available on account closure {@link FixedDepositAccount} & diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnHoldTransactionType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnHoldTransactionType.java similarity index 97% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnHoldTransactionType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnHoldTransactionType.java index 5d5d11adc..816d22d4c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnHoldTransactionType.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountOnHoldTransactionType.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.portfolio.savings; -import org.apache.fineract.portfolio.savings.domain.SavingsAccount; - /** * An enumeration of on hold transactions that can occur on a {@link SavingsAccount}. */ diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountType.java similarity index 98% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountType.java index 9a1218a8f..200d03506 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountType.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/DepositAccountType.java @@ -19,7 +19,6 @@ package org.apache.fineract.portfolio.savings; import org.apache.commons.lang3.StringUtils; -import org.apache.fineract.portfolio.savings.domain.SavingsAccount; /** * An enumeration of different transactions that can occur on a {@link SavingsAccount}. diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/PreClosurePenalInterestOnType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/PreClosurePenalInterestOnType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/PreClosurePenalInterestOnType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/PreClosurePenalInterestOnType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/RecurringDepositType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/RecurringDepositType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/RecurringDepositType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/RecurringDepositType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java similarity index 99% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java index 39fed1926..fb5997880 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.portfolio.savings; -import org.apache.fineract.portfolio.savings.domain.SavingsAccount; - /** * An enumeration of different transactions that can occur on a {@link SavingsAccount}. */ diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsCompoundingInterestPeriodType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsCompoundingInterestPeriodType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsCompoundingInterestPeriodType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsCompoundingInterestPeriodType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationDaysInYearType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationDaysInYearType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationDaysInYearType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationDaysInYearType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsInterestCalculationType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsPeriodFrequencyType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsPeriodFrequencyType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsPeriodFrequencyType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsPeriodFrequencyType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsPostingInterestPeriodType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsPostingInterestPeriodType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsPostingInterestPeriodType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsPostingInterestPeriodType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsWithdrawalFeesType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsWithdrawalFeesType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsWithdrawalFeesType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/SavingsWithdrawalFeesType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountApplicationTimelineData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountApplicationTimelineData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountApplicationTimelineData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountApplicationTimelineData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountChargeData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountChargeData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountChargeData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountChargeData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java similarity index 99% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java index 7791c7272..f24513978 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountData.java @@ -40,7 +40,7 @@ import org.apache.fineract.portfolio.charge.data.ChargeData; import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.group.data.GroupGeneralData; import org.apache.fineract.portfolio.savings.DepositAccountType; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransactionSummaryWrapper; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransactionDataSummaryWrapper; import org.apache.fineract.portfolio.savings.domain.SavingsHelper; import org.apache.fineract.portfolio.tax.data.TaxGroupData; @@ -127,7 +127,7 @@ public final class SavingsAccountData implements Serializable { private transient Integer rowIndex; private transient LocalDate startInterestCalculationDate; private LocalDate submittedOnDate; - private transient SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper; + private transient SavingsAccountTransactionDataSummaryWrapper savingsAccountTransactionSummaryWrapper; private transient SavingsHelper savingsHelper; private transient SavingsAccountSummaryData savingsAccountSummaryData; @@ -300,7 +300,7 @@ public final class SavingsAccountData implements Serializable { this.glAccountIdForInterestOnSavings = glAccountIdForInterestOnSavings; } - public void setHelpers(final SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper, + public void setHelpers(final SavingsAccountTransactionDataSummaryWrapper savingsAccountTransactionSummaryWrapper, final SavingsHelper savingsHelper) { this.savingsAccountTransactionSummaryWrapper = savingsAccountTransactionSummaryWrapper; this.savingsHelper = savingsHelper; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountStatusEnumData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSubStatusEnumData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSubStatusEnumData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSubStatusEnumData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSubStatusEnumData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java similarity index 97% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java index babf3f2d9..aa2176244 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountSummaryData.java @@ -29,8 +29,7 @@ import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.portfolio.savings.SavingsAccountTransactionType; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransactionSummaryWrapper; +import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransactionDataSummaryWrapper; import org.apache.fineract.portfolio.savings.domain.interest.PostingPeriod; /** @@ -90,8 +89,9 @@ public class SavingsAccountSummaryData implements Serializable { return this.runningBalanceOnInterestPostingTillDate; } - public void updateSummaryWithPivotConfig(final CurrencyData currency, final SavingsAccountTransactionSummaryWrapper wrapper, - final SavingsAccountTransaction transaction, final List savingsAccountTransactions) { + public void updateSummaryWithPivotConfig(final CurrencyData currency, final SavingsAccountTransactionDataSummaryWrapper wrapper, + final SavingsAccountTransactionToUpdateSummary transaction, + final List savingsAccountTransactions) { if (transaction != null) { if (transaction.isReversalTransaction()) { @@ -241,7 +241,7 @@ public class SavingsAccountSummaryData implements Serializable { return map; } - public void updateSummary(final CurrencyData currency, final SavingsAccountTransactionSummaryWrapper wrapper, + public void updateSummary(final CurrencyData currency, final SavingsAccountTransactionDataSummaryWrapper wrapper, final List transactions) { this.totalDeposits = wrapper.calculateTotalDeposits(currency, transactions); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionToUpdateSummary.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionToUpdateSummary.java new file mode 100644 index 000000000..199110c82 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionToUpdateSummary.java @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.savings.data; + +import java.math.BigDecimal; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class SavingsAccountTransactionToUpdateSummary { + + private final BigDecimal amount; + private final int typeOf; + private final boolean isReversalTransaction; + private final boolean isDepositAndNotReversed; + private final boolean isDividendPayoutAndNotReversed; + private final boolean isWithdrawal; + private final boolean isNotReversed; + private final boolean isWithdrawalFeeAndNotReversed; + private final boolean isAnnualFeeAndNotReversed; + private final boolean isWaiveFeeChargeAndNotReversed; + private final boolean isWaivePenaltyChargeAndNotReversed; + private final boolean isFeeChargeAndNotReversed; + private final boolean isPenaltyChargeAndNotReversed; + private final boolean isOverdraftInterestAndNotReversed; + private final boolean isWithHoldTaxAndNotReversed; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsProductData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargesPaidByData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargesPaidByData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargesPaidByData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountChargesPaidByData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountStatusType.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountStatusType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountStatusType.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountStatusType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSubStatusEnum.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSubStatusEnum.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSubStatusEnum.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountSubStatusEnum.java diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionDataSummaryWrapper.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionDataSummaryWrapper.java new file mode 100644 index 000000000..2655c256a --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionDataSummaryWrapper.java @@ -0,0 +1,145 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.savings.domain; + +import java.math.BigDecimal; +import java.util.List; +import org.apache.fineract.organisation.monetary.data.CurrencyData; +import org.apache.fineract.organisation.monetary.domain.Money; +import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; +import org.springframework.stereotype.Component; + +/** + * A wrapper for dealing with side-effect free functionality related to a {@link SavingsAccount}'s + * {@link SavingsAccountTransaction}'s. + */ +@Component +public final class SavingsAccountTransactionDataSummaryWrapper { + + public BigDecimal calculateTotalDeposits(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isDepositAndNotReversed() || transaction.isDividendPayoutAndNotReversed()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalWithdrawals(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isWithdrawal() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalInterestPosted(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isInterestPostingAndNotReversed() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalWithdrawalFees(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isWithdrawalFeeAndNotReversed() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalAnnualFees(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isAnnualFeeAndNotReversed() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalFeesCharge(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isFeeChargeAndNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalFeesChargeWaived(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isWaiveFeeChargeAndNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalPenaltyCharge(final CurrencyData currency, final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isPenaltyChargeAndNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalPenaltyChargeWaived(final CurrencyData currency, + final List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isWaivePenaltyChargeAndNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalOverdraftInterest(CurrencyData currency, List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isOverdraftInterestAndNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } + + public BigDecimal calculateTotalWithholdTaxWithdrawal(CurrencyData currency, List transactions) { + Money total = Money.zero(currency); + for (final SavingsAccountTransactionData transaction : transactions) { + if (transaction.isWithHoldTaxAndNotReversed() && !transaction.isReversalTransaction()) { + total = total.plus(transaction.getAmount()); + } + } + return total.getAmountDefaultedToNullIfZero(); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsHelper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/AnnualCompoundingPeriod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/BiAnnualCompoundingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/BiAnnualCompoundingPeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/BiAnnualCompoundingPeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/BiAnnualCompoundingPeriod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestHelper.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestHelper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestHelper.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestHelper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestValues.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestValues.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestValues.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundInterestValues.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundingPeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundingPeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/CompoundingPeriod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/DailyCompoundingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/DailyCompoundingPeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/DailyCompoundingPeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/DailyCompoundingPeriod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/EndOfDayBalance.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/EndOfDayBalance.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/EndOfDayBalance.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/EndOfDayBalance.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/MonthlyCompoundingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/MonthlyCompoundingPeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/MonthlyCompoundingPeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/MonthlyCompoundingPeriod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java similarity index 98% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java index 9fb422440..f65b7ce60 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/PostingPeriod.java @@ -33,7 +33,6 @@ import org.apache.fineract.organisation.monetary.domain.Money; import org.apache.fineract.portfolio.savings.SavingsCompoundingInterestPeriodType; import org.apache.fineract.portfolio.savings.SavingsInterestCalculationType; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; -import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction; public final class PostingPeriod { @@ -66,7 +65,7 @@ public final class PostingPeriod { private Integer financialYearBeginningMonth; public static PostingPeriod createFrom(final LocalDateInterval periodInterval, final Money periodStartingBalance, - final List orderedListOfTransactions, final MonetaryCurrency currency, + final List orderedListOfTransactions, final MonetaryCurrency currency, final SavingsCompoundingInterestPeriodType interestCompoundingPeriodType, final SavingsInterestCalculationType interestCalculationType, final BigDecimal interestRateAsFraction, final long daysInYear, final LocalDate upToInterestCalculationDate, Collection interestPostTransactions, boolean isInterestTransfer, @@ -85,7 +84,7 @@ public final class PostingPeriod { // isInterestTransfer boolean is to identify newly created transaction is // interest transfer public static PostingPeriod createFrom(final LocalDateInterval periodInterval, final Money periodStartingBalance, - final List orderedListOfTransactions, final MonetaryCurrency currency, + final List orderedListOfTransactions, final MonetaryCurrency currency, final SavingsCompoundingInterestPeriodType interestCompoundingPeriodType, final SavingsInterestCalculationType interestCalculationType, final BigDecimal interestRateAsFraction, final long daysInYear, final LocalDate upToInterestCalculationDate, Collection interestPostTransactions, boolean isInterestTransfer, @@ -98,7 +97,7 @@ public final class PostingPeriod { Money openingDayBalance = periodStartingBalance; Money closeOfDayBalance = openingDayBalance; - for (final SavingsAccountTransaction transaction : orderedListOfTransactions) { + for (final SavingsAccountTransactionDetailsForPostingPeriod transaction : orderedListOfTransactions) { if (transaction.fallsWithin(periodInterval)) { // the balance of the transaction falls entirely within this diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/QuarterlyCompoundingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/QuarterlyCompoundingPeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/QuarterlyCompoundingPeriod.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/QuarterlyCompoundingPeriod.java diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/SavingsAccountTransactionDetailsForPostingPeriod.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/SavingsAccountTransactionDetailsForPostingPeriod.java new file mode 100644 index 000000000..ce9a54650 --- /dev/null +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/domain/interest/SavingsAccountTransactionDetailsForPostingPeriod.java @@ -0,0 +1,136 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.savings.domain.interest; + +import java.math.BigDecimal; +import java.time.LocalDate; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.apache.fineract.infrastructure.core.domain.LocalDateInterval; +import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; +import org.apache.fineract.organisation.monetary.domain.Money; + +@Getter +@RequiredArgsConstructor +public class SavingsAccountTransactionDetailsForPostingPeriod { + + private final Long id; + private final LocalDate transactionDate; + private final LocalDate endOfBalanceDate; + private final BigDecimal runningBalance; + private final BigDecimal amount; + private final MonetaryCurrency currency; + private final Integer balanceNumberOfDays; + private final boolean isDeposit; + private final boolean isWithdrawal; + private final boolean isAllowOverdraft; + private final boolean isChargeTransactionAndNotReversed; + private final boolean isDividendPayoutAndNotReversed; + + public boolean fallsWithin(final LocalDateInterval periodInterval) { + final LocalDateInterval balanceInterval = LocalDateInterval.create(getTransactionDate(), getEndOfBalanceDate()); + return periodInterval.contains(balanceInterval); + } + + public boolean spansAnyPortionOf(final LocalDateInterval periodInterval) { + final LocalDateInterval balanceInterval = LocalDateInterval.create(getTransactionDate(), getEndOfBalanceDate()); + return balanceInterval.containsPortionOf(periodInterval); + } + + public boolean occursOn(final LocalDate occursOnDate) { + return getTransactionDate().isEqual(occursOnDate); + } + + public EndOfDayBalance toEndOfDayBalance(final Money openingBalance) { + final MonetaryCurrency currency = openingBalance.getCurrency(); + Money endOfDayBalance = openingBalance.copy(); + if (isDeposit() || isDividendPayoutAndNotReversed()) { + endOfDayBalance = openingBalance.plus(getAmount(currency)); + } else if (isWithdrawal() || isChargeTransactionAndNotReversed()) { + + if (openingBalance.isGreaterThanZero() || isAllowOverdraft()) { + endOfDayBalance = openingBalance.minus(getAmount(currency)); + } else { + endOfDayBalance = Money.of(currency, this.runningBalance); + } + } + + return EndOfDayBalance.from(getTransactionDate(), openingBalance, endOfDayBalance, this.balanceNumberOfDays); + } + + public EndOfDayBalance toEndOfDayBalance(final LocalDateInterval periodInterval, final MonetaryCurrency currency) { + + final Money endOfDayBalance = Money.of(currency, this.runningBalance); + final Money openingBalance = endOfDayBalance; + + LocalDate balanceDate = periodInterval.startDate(); + + int numberOfDays = periodInterval.daysInPeriodInclusiveOfEndDate(); + if (periodInterval.contains(getTransactionDate())) { + balanceDate = getTransactionDate(); + final LocalDateInterval newInterval = LocalDateInterval.create(getTransactionDate(), periodInterval.endDate()); + numberOfDays = newInterval.daysInPeriodInclusiveOfEndDate(); + } + + return EndOfDayBalance.from(balanceDate, openingBalance, endOfDayBalance, numberOfDays); + } + + public EndOfDayBalance toEndOfDayBalanceBoundedBy(final Money openingBalance, final LocalDateInterval boundedBy) { + + final MonetaryCurrency currency = openingBalance.getCurrency(); + Money endOfDayBalance = openingBalance.copy(); + + int numberOfDaysOfBalance = this.balanceNumberOfDays; + + LocalDate balanceStartDate = getTransactionDate(); + LocalDate balanceEndDate = getEndOfBalanceDate(); + + if (boundedBy.startDate().isAfter(balanceStartDate)) { + balanceStartDate = boundedBy.startDate(); + final LocalDateInterval spanOfBalance = LocalDateInterval.create(balanceStartDate, balanceEndDate); + numberOfDaysOfBalance = spanOfBalance.daysInPeriodInclusiveOfEndDate(); + } else { + if (isDeposit() || isDividendPayoutAndNotReversed()) { + // endOfDayBalance = openingBalance.plus(getAmount(currency)); + // if (endOfDayBalance.isLessThanZero()) { + endOfDayBalance = endOfDayBalance.plus(getAmount(currency)); + // } + } else if (isWithdrawal() || isChargeTransactionAndNotReversed()) { + // endOfDayBalance = openingBalance.minus(getAmount(currency)); + if (endOfDayBalance.isGreaterThanZero() || isAllowOverdraft()) { + endOfDayBalance = endOfDayBalance.minus(getAmount(currency)); + } else { + endOfDayBalance = Money.of(currency, this.runningBalance); + } + } + } + + if (balanceEndDate.isAfter(boundedBy.endDate())) { + balanceEndDate = boundedBy.endDate(); + final LocalDateInterval spanOfBalance = LocalDateInterval.create(balanceStartDate, balanceEndDate); + numberOfDaysOfBalance = spanOfBalance.daysInPeriodInclusiveOfEndDate(); + } + + return EndOfDayBalance.from(balanceStartDate, openingBalance, endOfDayBalance, numberOfDaysOfBalance); + } + + private Money getAmount(MonetaryCurrency currency) { + return Money.of(currency, getAmount()); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxApiConstants.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/api/TaxApiConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/api/TaxApiConstants.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/api/TaxApiConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentHistoryData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentHistoryData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentHistoryData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxComponentHistoryData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxDetailsData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxDetailsData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxDetailsData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxDetailsData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupMappingsData.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupMappingsData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupMappingsData.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/data/TaxGroupMappingsData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponent.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponentHistory.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponentHistory.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponentHistory.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxComponentHistory.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroup.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroup.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroup.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroup.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroupMappings.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroupMappings.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroupMappings.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/domain/TaxGroupMappings.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/exception/TaxMappingNotFoundException.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/tax/exception/TaxMappingNotFoundException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/tax/exception/TaxMappingNotFoundException.java rename to fineract-core/src/main/java/org/apache/fineract/portfolio/tax/exception/TaxMappingNotFoundException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/data/PermissionData.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/data/PermissionData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/data/PermissionData.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/data/PermissionData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/data/RoleData.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/data/RoleData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/data/RoleData.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/data/RoleData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/data/RolePermissionsData.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/data/RolePermissionsData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/data/RolePermissionsData.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/data/RolePermissionsData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUser.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/domain/AppUserClientMapping.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/Permission.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/Permission.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/Permission.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/domain/Permission.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/Role.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/domain/Role.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/Role.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/domain/Role.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserConstants.java b/fineract-core/src/main/java/org/apache/fineract/useradministration/service/AppUserConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/useradministration/service/AppUserConstants.java rename to fineract-core/src/main/java/org/apache/fineract/useradministration/service/AppUserConstants.java diff --git a/fineract-core/src/main/resources/jpa/core/persistence.xml b/fineract-core/src/main/resources/jpa/core/persistence.xml new file mode 100644 index 000000000..105688157 --- /dev/null +++ b/fineract-core/src/main/resources/jpa/core/persistence.xml @@ -0,0 +1,37 @@ + + + + + + + + + + org.eclipse.persistence.jpa.PersistenceProvider + false + + + + + diff --git a/fineract-doc/src/docs/en/chapters/custom/business-step.adoc b/fineract-doc/src/docs/en/chapters/custom/business-step.adoc index 060bcdc49..b8f5a7bc6 100644 --- a/fineract-doc/src/docs/en/chapters/custom/business-step.adoc +++ b/fineract-doc/src/docs/en/chapters/custom/business-step.adoc @@ -9,7 +9,7 @@ It very easy to add your own business steps to Fineract's default steps: .Business Step Interface [source,java] ---- -include::{rootdir}/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStep.java[lines=19..] +include::{rootdir}/fineract-core/src/main/java/org/apache/fineract/cob/COBBusinessStep.java[lines=19..] ---- == Business Step Implementation @@ -33,4 +33,4 @@ As you can see this implementation is very simple and doesn't do much. There are include::{rootdir}/custom/acme/loan/cob/src/main/resources/db/custom-changelog/0001_acme_loan_cob.xml[lines=22..] ---- -NOTE: See also chapter about batch jobs in this documentation. \ No newline at end of file +NOTE: See also chapter about batch jobs in this documentation. diff --git a/fineract-doc/src/docs/en/chapters/custom/loan-transaction-processor.adoc b/fineract-doc/src/docs/en/chapters/custom/loan-transaction-processor.adoc index 175c50b64..6438712f3 100644 --- a/fineract-doc/src/docs/en/chapters/custom/loan-transaction-processor.adoc +++ b/fineract-doc/src/docs/en/chapters/custom/loan-transaction-processor.adoc @@ -29,7 +29,7 @@ include::{rootdir}/fineract-provider/src/main/resources/application.properties[l .Loan Transaction Processor Interface [source,java] ---- -include::{rootdir}/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java[lines=19..] +include::{rootdir}/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java[lines=19..] ---- .Custom Loan Transaction Processor Example @@ -88,7 +88,7 @@ IMPORTANT: It is preferable to use the processor code to lookup processor instan .Loan Transaction Processor Factory Implementation [source,java] ---- -include::{rootdir}/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleTransactionProcessorFactory.java[lines=19..] +include::{rootdir}/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleTransactionProcessorFactory.java[lines=19..] ---- This is the default factory auto-configuration. diff --git a/fineract-doc/src/docs/en/images/diag-28a77b45f78221c5cb0e8f5d27c6b34f.png b/fineract-doc/src/docs/en/images/diag-28a77b45f78221c5cb0e8f5d27c6b34f.png new file mode 100644 index 0000000000000000000000000000000000000000..679badc96c5a2868f4a89e4e5e39af073fbfd8ba GIT binary patch literal 8684 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 ZrdKs;LUy()TJS7FQ&sm|{@Kg-{s*|S=U)H- literal 13644 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 Ygq|Ps-N$6$*!v|JNd<{wF$0hP1s)WKO#lD@ literal 15903 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 L+*L1EwTk!;WJH9Y literal 7235 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 diff --git a/fineract-investor/build.gradle b/fineract-investor/build.gradle index d6e05c3fd..61fbb5a44 100644 --- a/fineract-investor/build.gradle +++ b/fineract-investor/build.gradle @@ -84,7 +84,7 @@ modernizer { // If we are running Gradle within Eclipse to enhance classes with OpenJPA, // set the classes directory to point to Eclipse's default build directory if (project.hasProperty('env') && project.getProperty('env') == 'eclipse') { - sourceSets.main.java.outputDir = new File(rootProject.projectDir, "fineract-core/bin/main") + sourceSets.main.java.outputDir = new File(rootProject.projectDir, "fineract-investor/bin/main") } eclipse { diff --git a/fineract-investor/dependencies.gradle b/fineract-investor/dependencies.gradle index c2c6fb8dd..0fbe2c09f 100644 --- a/fineract-investor/dependencies.gradle +++ b/fineract-investor/dependencies.gradle @@ -25,6 +25,7 @@ dependencies { // implementation dependencies are directly used (compiled against) in src/main (and src/test) // implementation(project(path: ':fineract-core')) + implementation(project(path: ':fineract-loan')) implementation( 'org.springframework.boot:spring-boot-starter-web', diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractAuditableWithUTCDateTimeCustom.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractAuditableWithUTCDateTimeCustom.java deleted file mode 100644 index cca8f6eeb..000000000 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractAuditableWithUTCDateTimeCustom.java +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.investor.domain; - -import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.CREATED_BY_DB_FIELD; -import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.CREATED_DATE_DB_FIELD; -import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.LAST_MODIFIED_BY_DB_FIELD; -import static org.apache.fineract.infrastructure.core.domain.AuditableFieldsConstants.LAST_MODIFIED_DATE_DB_FIELD; - -import java.time.OffsetDateTime; -import java.util.Optional; -import javax.persistence.Column; -import javax.persistence.MappedSuperclass; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.apache.fineract.infrastructure.core.service.DateUtils; -import org.springframework.data.domain.Auditable; -import org.springframework.data.jpa.domain.AbstractAuditable; - -/** - * A custom copy of {@link AbstractAuditable} to override the column names used on database. It also uses OffsetDateTime - * for created and modified. The datetimes will be converted from tenant TZ to UTC before storing (automatically - * happens) and converted from System TZ to tenant TZ after fetching from DB - * - * Abstract base class for auditable entities. Stores the audit values in persistent fields. - */ -@MappedSuperclass -@Getter -@Setter -@NoArgsConstructor -public abstract class AbstractAuditableWithUTCDateTimeCustom extends AbstractPersistableCustom - implements Auditable { - - private static final long serialVersionUID = 141481953116476081L; - - @Column(name = CREATED_BY_DB_FIELD, nullable = false) - @Setter(onMethod = @__(@Override)) - private Long createdBy; - - @Column(name = CREATED_DATE_DB_FIELD, nullable = false) - @Setter(onMethod = @__(@Override)) - private OffsetDateTime createdDate; - - @Column(name = LAST_MODIFIED_BY_DB_FIELD, nullable = false) - @Setter(onMethod = @__(@Override)) - private Long lastModifiedBy; - - @Column(name = LAST_MODIFIED_DATE_DB_FIELD, nullable = false) - @Setter(onMethod = @__(@Override)) - private OffsetDateTime lastModifiedDate; - - @Override - public Optional getCreatedBy() { - return Optional.ofNullable(this.createdBy); - } - - @Override - public Optional getCreatedDate() { - if (this.createdDate == null) { - return Optional.empty(); - } else { - return Optional.of(this.createdDate - .withOffsetSameInstant(DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(this.createdDate.toInstant()))); - } - } - - @Override - public Optional getLastModifiedBy() { - return Optional.ofNullable(this.lastModifiedBy); - } - - @Override - public Optional getLastModifiedDate() { - if (this.lastModifiedDate == null) { - return Optional.empty(); - } else { - return Optional.of(this.lastModifiedDate - .withOffsetSameInstant(DateUtils.getDateTimeZoneOfTenant().getRules().getOffset(this.lastModifiedDate.toInstant()))); - } - } - -} diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractPersistableCustom.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractPersistableCustom.java deleted file mode 100644 index d9dfae037..000000000 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/AbstractPersistableCustom.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.investor.domain; - -import java.io.Serializable; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; -import javax.persistence.PostLoad; -import javax.persistence.PrePersist; -import javax.persistence.Transient; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.springframework.data.domain.Persistable; - -/** - * This class is a copy paste from the fineract-provider module since EclipseLink not weaves the class properly if it's - * placed in the fineract-core module. - */ -@MappedSuperclass -@Getter -@Setter -@NoArgsConstructor -public abstract class AbstractPersistableCustom implements Persistable, Serializable { - - private static final long serialVersionUID = 9181640245194392646L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Getter(onMethod = @__(@Override)) - private Long id; - - @Transient - @Setter(value = AccessLevel.NONE) - @Getter(onMethod = @__(@Override)) - private boolean isNew = true; - - @PrePersist - @PostLoad - void markNotNew() { - this.isNew = false; - } -} diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwner.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwner.java index 4f2422c78..bb2803f31 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwner.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwner.java @@ -24,6 +24,7 @@ import javax.persistence.Table; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; import org.apache.fineract.infrastructure.core.domain.ExternalId; @Getter diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransfer.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransfer.java index 468c3dc22..618c11ecb 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransfer.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransfer.java @@ -27,6 +27,7 @@ import javax.persistence.Table; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; import org.apache.fineract.infrastructure.core.domain.ExternalId; @Getter diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferLoanMapping.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferLoanMapping.java index c0add21d2..f94683a24 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferLoanMapping.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/ExternalAssetOwnerTransferLoanMapping.java @@ -27,6 +27,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom; @Getter @Setter diff --git a/fineract-investor/src/main/resources/jpa/investor/persistence.xml b/fineract-investor/src/main/resources/jpa/investor/persistence.xml index 105688157..f1c5a63c7 100644 --- a/fineract-investor/src/main/resources/jpa/investor/persistence.xml +++ b/fineract-investor/src/main/resources/jpa/investor/persistence.xml @@ -29,6 +29,43 @@ org.eclipse.persistence.jpa.PersistenceProvider + org.apache.fineract.accounting.glaccount.domain.GLAccount + org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom + org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom + org.apache.fineract.infrastructure.codes.domain.Code + org.apache.fineract.infrastructure.codes.domain.CodeValue + org.apache.fineract.infrastructure.documentmanagement.domain.Image + org.apache.fineract.organisation.staff.domain.Staff + org.apache.fineract.organisation.office.domain.Office + org.apache.fineract.organisation.office.domain.OrganisationCurrency + org.apache.fineract.organisation.monetary.domain.ApplicationCurrency + org.apache.fineract.organisation.holiday.domain.Holiday + org.apache.fineract.organisation.workingdays.domain.WorkingDays + org.apache.fineract.portfolio.group.domain.Group + org.apache.fineract.portfolio.group.domain.GroupLevel + org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory + org.apache.fineract.portfolio.group.domain.GroupRole + org.apache.fineract.portfolio.client.domain.Client + org.apache.fineract.portfolio.rate.domain.Rate + org.apache.fineract.portfolio.fund.domain.Fund + org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket + org.apache.fineract.portfolio.delinquency.domain.DelinquencyRange + org.apache.fineract.portfolio.charge.domain.Charge + org.apache.fineract.portfolio.paymenttype.domain.PaymentType + org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail + org.apache.fineract.portfolio.tax.domain.TaxGroup + org.apache.fineract.portfolio.tax.domain.TaxGroupMappings + org.apache.fineract.portfolio.tax.domain.TaxComponent + org.apache.fineract.portfolio.tax.domain.TaxComponentHistory + org.apache.fineract.portfolio.floatingrates.domain.FloatingRate + org.apache.fineract.portfolio.floatingrates.domain.FloatingRatePeriod + org.apache.fineract.portfolio.calendar.domain.Calendar + org.apache.fineract.portfolio.calendar.domain.CalendarHistory + org.apache.fineract.portfolio.calendar.domain.CalendarInstance + org.apache.fineract.useradministration.domain.AppUser + org.apache.fineract.useradministration.domain.Role + org.apache.fineract.useradministration.domain.Permission + org.apache.fineract.useradministration.domain.AppUserClientMapping false diff --git a/fineract-loan/build.gradle b/fineract-loan/build.gradle new file mode 100644 index 000000000..588060d04 --- /dev/null +++ b/fineract-loan/build.gradle @@ -0,0 +1,108 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +description = 'Fineract Loan' + +apply plugin: 'java' +apply plugin: 'eclipse' + +check.dependsOn('cucumber') + +compileJava.doLast { + def mainSS = sourceSets.main + def source = mainSS.java.classesDirectory.get() + copy { + from file("src/main/resources/jpa/loan/persistence.xml") + into "${source}/META-INF/" + } + javaexec { + description = 'Performs EclipseLink static weaving of entity classes' + def target = source + main 'org.eclipse.persistence.tools.weaving.jpa.StaticWeave' + args '-persistenceinfo', source, '-classpath', sourceSets.main.runtimeClasspath, source, target + classpath sourceSets.main.runtimeClasspath + } + delete { + delete "${source}/META-INF/persistence.xml" + } +} + +// Configuration for Swagger documentation generation task +// https://github.com/swagger-api/swagger-core/tree/master/modules/swagger-gradle-plugin +import org.apache.tools.ant.filters.ReplaceTokens + + + +configurations { + providedRuntime // needed for Spring Boot executable WAR + providedCompile + compile() { + exclude module: 'hibernate-entitymanager' + exclude module: 'hibernate-validator' + exclude module: 'activation' + exclude module: 'bcmail-jdk14' + exclude module: 'bcprov-jdk14' + exclude module: 'bctsp-jdk14' + exclude module: 'c3p0' + exclude module: 'stax-api' + exclude module: 'jaxb-api' + exclude module: 'jaxb-impl' + exclude module: 'jboss-logging' + exclude module: 'itext-rtf' + exclude module: 'classworlds' + } + runtime +} + +apply from: 'dependencies.gradle' + +// Configuration for the modernizer plugin +// https://github.com/andygoossens/gradle-modernizer-plugin +modernizer { + ignoreClassNamePatterns = [ + '.*AbstractPersistableCustom', + '.*EntityTables', + '.*domain.*' + ] +} + +// If we are running Gradle within Eclipse to enhance classes with OpenJPA, +// set the classes directory to point to Eclipse's default build directory +if (project.hasProperty('env') && project.getProperty('env') == 'eclipse') { + sourceSets.main.java.outputDir = new File(rootProject.projectDir, "fineract-loan/bin/main") +} + +eclipse { + project { + buildCommand([ LaunchConfigHandle: "/.externalToolBuilders/OpenJPA Enhance Builder.launch" ], 'org.eclipse.ui.externaltools.ExternalToolBuilder') + } +} + +/* http://stackoverflow.com/questions/19653311/jpa-repository-works-in-idea-and-production-but-not-in-gradle */ +sourceSets.main.output.resourcesDir = sourceSets.main.java.outputDir +sourceSets.test.output.resourcesDir = sourceSets.test.java.outputDir + +if (!(project.hasProperty('env') && project.getProperty('env') == 'dev')) { + sourceSets { + test { + java { + exclude '**/core/boot/tests/**' + } + } + } +} diff --git a/fineract-loan/dependencies.gradle b/fineract-loan/dependencies.gradle new file mode 100644 index 000000000..c2c6fb8dd --- /dev/null +++ b/fineract-loan/dependencies.gradle @@ -0,0 +1,75 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +dependencies { + // Never use "compile" scope, but make all dependencies either 'implementation', 'runtimeOnly' or 'testCompile'. + // Note that we never use 'api', because Fineract at least currently is a simple monolithic application ("WAR"), not a library. + // We also (normally should have) no need to ever use 'compileOnly'. + + // implementation dependencies are directly used (compiled against) in src/main (and src/test) + // + implementation(project(path: ':fineract-core')) + + implementation( + 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-security', + 'jakarta.ws.rs:jakarta.ws.rs-api', + 'org.glassfish.jersey.media:jersey-media-multipart', + + 'com.google.guava:guava', + 'com.google.code.gson:gson', + + 'org.apache.commons:commons-lang3', + + 'com.jayway.jsonpath:json-path', + + 'com.github.spotbugs:spotbugs-annotations', + 'io.swagger.core.v3:swagger-annotations', + + 'com.squareup.retrofit2:converter-gson', + + 'org.springdoc:springdoc-openapi-security', + 'org.mapstruct:mapstruct', + + 'io.github.resilience4j:resilience4j-spring-boot2', + ) + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + annotationProcessor 'org.mapstruct:mapstruct-processor' + implementation ('org.springframework.boot:spring-boot-starter-data-jpa') { + exclude group: 'org.hibernate' + } + implementation('org.eclipse.persistence:org.eclipse.persistence.jpa') { + exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence' + } + // testCompile dependencies are ONLY used in src/test, not src/main. + // Do NOT repeat dependencies which are ALREADY in implementation or runtimeOnly! + // + testImplementation( 'io.cucumber:cucumber-spring', + 'io.github.classgraph:classgraph', + ) + testImplementation ('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'com.jayway.jsonpath', module: 'json-path' + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + exclude group: 'jakarta.activation' + exclude group: 'javax.activation' + exclude group: 'org.skyscreamer' + } + testImplementation ('org.mockito:mockito-inline') +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBBusinessStep.java b/fineract-loan/src/main/java/org/apache/fineract/cob/loan/LoanCOBBusinessStep.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBBusinessStep.java rename to fineract-loan/src/main/java/org/apache/fineract/cob/loan/LoanCOBBusinessStep.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/interoperation/util/MathUtil.java b/fineract-loan/src/main/java/org/apache/fineract/interoperation/util/MathUtil.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/interoperation/util/MathUtil.java rename to fineract-loan/src/main/java/org/apache/fineract/interoperation/util/MathUtil.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeWithoutMandatoryFieldException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeWithoutMandatoryFieldException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeWithoutMandatoryFieldException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/charge/exception/LoanChargeWithoutMandatoryFieldException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralApiConstants.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralApiConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralApiConstants.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralApiConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/data/CollateralData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateral/data/CollateralData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/data/CollateralData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/collateral/data/CollateralData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/domain/LoanCollateral.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateral/domain/LoanCollateral.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/domain/LoanCollateral.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/collateral/domain/LoanCollateral.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementJsonInputParams.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementJsonInputParams.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementJsonInputParams.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/CollateralManagementJsonInputParams.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/ClientCollateralManagement.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/ClientCollateralManagement.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/ClientCollateralManagement.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/ClientCollateralManagement.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/collateralmanagement/domain/CollateralManagementDomain.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanApiConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/command/LoanChargeCommand.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/command/LoanChargeCommand.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/command/LoanChargeCommand.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/command/LoanChargeCommand.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/DisbursementData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/DisbursementData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/DisbursementData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/DisbursementData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/HolidayDetailDTO.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/HolidayDetailDTO.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/HolidayDetailDTO.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/HolidayDetailDTO.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargeData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargeData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargeData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargeData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidByData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidByData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidByData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidByData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidDetail.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidDetail.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidDetail.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanChargePaidDetail.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanCollateralManagementData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanCollateralManagementData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanCollateralManagementData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanCollateralManagementData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanInstallmentChargeData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanInstallmentChargeData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanInstallmentChargeData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanInstallmentChargeData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanRepaymentScheduleInstallmentData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanRepaymentScheduleInstallmentData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanRepaymentScheduleInstallmentData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanRepaymentScheduleInstallmentData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanStatusEnumData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanStatusEnumData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanStatusEnumData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanStatusEnumData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsDataWrapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsDataWrapper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsDataWrapper.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTermVariationsDataWrapper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionEnumData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionRelationData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionRelationData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionRelationData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionRelationData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/ScheduleGeneratorDTO.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/ScheduleGeneratorDTO.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/ScheduleGeneratorDTO.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/ScheduleGeneratorDTO.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/ChangedTransactionDetail.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/ChangedTransactionDetail.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/ChangedTransactionDetail.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/ChangedTransactionDetail.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/GroupLoanIndividualMonitoringAccount.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/GroupLoanIndividualMonitoringAccount.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/GroupLoanIndividualMonitoringAccount.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/GroupLoanIndividualMonitoringAccount.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCharge.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargePaidBy.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargePaidBy.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargePaidBy.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanChargePaidBy.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanCollateralManagement.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanDisbursementDetails.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanDisbursementDetails.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanDisbursementDetails.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanDisbursementDetails.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanEvent.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanEvent.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanEvent.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanEvent.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInstallmentCharge.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalcualtionAdditionalDetails.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalcualtionAdditionalDetails.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalcualtionAdditionalDetails.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalcualtionAdditionalDetails.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanInterestRecalculationDetails.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanLifecycleStateMachine.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanLifecycleStateMachine.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanLifecycleStateMachine.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanLifecycleStateMachine.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOfficerAssignmentHistory.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOfficerAssignmentHistory.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOfficerAssignmentHistory.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOfficerAssignmentHistory.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOverdueInstallmentCharge.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOverdueInstallmentCharge.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOverdueInstallmentCharge.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanOverdueInstallmentCharge.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleInstallment.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleTransactionProcessorFactory.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleTransactionProcessorFactory.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleTransactionProcessorFactory.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleTransactionProcessorFactory.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanStatus.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanStatus.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanStatus.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanStatus.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSubStatus.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSubStatus.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSubStatus.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSubStatus.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummary.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryWrapper.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariationType.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariationType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariationType.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariationType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTermVariations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTopupDetails.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheCharge.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTrancheDisbursementCharge.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransaction.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionComparator.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionComparator.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionComparator.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionComparator.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelation.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelation.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelation.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelation.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelationTypeEnum.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelationTypeEnum.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelationTypeEnum.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionRelationTypeEnum.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionToRepaymentScheduleMapping.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanTransactionType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/LoanRepaymentScheduleTransactionProcessor.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/ExceedingTrancheCountException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/ExceedingTrancheCountException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/ExceedingTrancheCountException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/ExceedingTrancheCountException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanStateTransitionException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanStateTransitionException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanStateTransitionException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanStateTransitionException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanTransactionTypeException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanTransactionTypeException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanTransactionTypeException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidLoanTransactionTypeException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidRefundDateException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidRefundDateException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidRefundDateException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/InvalidRefundDateException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanApplicationDateException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanApplicationDateException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanApplicationDateException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanApplicationDateException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanChargeRefundException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanChargeRefundException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanChargeRefundException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanChargeRefundException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanDisbursalException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanDisbursalException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanDisbursalException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanDisbursalException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanForeclosureException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanForeclosureException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanForeclosureException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanForeclosureException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentDateException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentDateException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentDateException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentDateException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerAssignmentException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerUnassignmentDateException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerUnassignmentDateException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerUnassignmentDateException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanOfficerUnassignmentDateException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanTransactionProcessingStrategyNotFoundException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanTransactionProcessingStrategyNotFoundException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanTransactionProcessingStrategyNotFoundException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/LoanTransactionProcessingStrategyNotFoundException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataNotAllowedException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataNotAllowedException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataNotAllowedException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataNotAllowedException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataRequiredException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataRequiredException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataRequiredException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/MultiDisbursementDataRequiredException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/UndoLastTrancheDisbursementException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/UndoLastTrancheDisbursementException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/UndoLastTrancheDisbursementException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/exception/UndoLastTrancheDisbursementException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleDTO.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleDTO.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleDTO.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleDTO.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanScheduleData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/LoanSchedulePeriodData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AprCalculator.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AprCalculator.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AprCalculator.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/AprCalculator.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FinanicalFunctions.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FinanicalFunctions.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FinanicalFunctions.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/FinanicalFunctions.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanApplicationTerms.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGenerator.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGenerator.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGenerator.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGenerator.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGeneratorFactory.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGeneratorFactory.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGeneratorFactory.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleGeneratorFactory.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModel.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelPeriod.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelPeriod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelPeriod.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/LoanScheduleModelPeriod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PaymentPeriodsInOneYearCalculator.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PrincipalInterest.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PrincipalInterest.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PrincipalInterest.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/domain/PrincipalInterest.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/LoanProductConstants.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/data/TransactionProcessingStrategyData.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/TransactionProcessingStrategyData.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/data/TransactionProcessingStrategyData.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/data/TransactionProcessingStrategyData.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AmortizationMethod.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AmortizationMethod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AmortizationMethod.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/AmortizationMethod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestCalculationPeriodMethod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestMethod.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestMethod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestMethod.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestMethod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestRecalculationCompoundingMethod.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestRecalculationCompoundingMethod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestRecalculationCompoundingMethod.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/InterestRecalculationCompoundingMethod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanPreClosureInterestCalculationStrategy.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanPreClosureInterestCalculationStrategy.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanPreClosureInterestCalculationStrategy.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanPreClosureInterestCalculationStrategy.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProduct.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductBorrowerCycleVariations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductConfigurableAttributes.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductFloatingRates.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductGuaranteeDetails.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductInterestRecalculationDetails.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinMaxConstraints.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinMaxConstraints.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinMaxConstraints.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinMaxConstraints.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductMinimumRepaymentScheduleRelatedDetail.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductParamType.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductParamType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductParamType.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductParamType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRelatedDetail.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRelatedDetail.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRelatedDetail.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductRelatedDetail.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductTrancheDetails.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductValueConditionType.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductValueConditionType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductValueConditionType.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductValueConditionType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanProductVariableInstallmentConfig.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanRescheduleStrategyMethod.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanRescheduleStrategyMethod.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanRescheduleStrategyMethod.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/LoanRescheduleStrategyMethod.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/RecalculationFrequencyType.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/RecalculationFrequencyType.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/RecalculationFrequencyType.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/domain/RecalculationFrequencyType.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductGeneralRuleException.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductGeneralRuleException.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductGeneralRuleException.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/exception/LoanProductGeneralRuleException.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/loanproduct/service/LoanEnumerations.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/domain/PostDatedChecks.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/domain/PostDatedChecks.java similarity index 100% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/domain/PostDatedChecks.java rename to fineract-loan/src/main/java/org/apache/fineract/portfolio/repaymentwithpostdatedchecks/domain/PostDatedChecks.java diff --git a/fineract-loan/src/main/resources/jpa/loan/persistence.xml b/fineract-loan/src/main/resources/jpa/loan/persistence.xml new file mode 100644 index 000000000..b3d099766 --- /dev/null +++ b/fineract-loan/src/main/resources/jpa/loan/persistence.xml @@ -0,0 +1,75 @@ + + + + + + + + + + org.eclipse.persistence.jpa.PersistenceProvider + + org.apache.fineract.accounting.glaccount.domain.GLAccount + org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom + org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom + org.apache.fineract.infrastructure.codes.domain.Code + org.apache.fineract.infrastructure.codes.domain.CodeValue + org.apache.fineract.infrastructure.documentmanagement.domain.Image + org.apache.fineract.organisation.staff.domain.Staff + org.apache.fineract.organisation.office.domain.Office + org.apache.fineract.organisation.office.domain.OrganisationCurrency + org.apache.fineract.organisation.monetary.domain.ApplicationCurrency + org.apache.fineract.organisation.holiday.domain.Holiday + org.apache.fineract.organisation.workingdays.domain.WorkingDays + org.apache.fineract.portfolio.group.domain.Group + org.apache.fineract.portfolio.group.domain.GroupLevel + org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory + org.apache.fineract.portfolio.group.domain.GroupRole + org.apache.fineract.portfolio.client.domain.Client + org.apache.fineract.portfolio.rate.domain.Rate + org.apache.fineract.portfolio.fund.domain.Fund + org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket + org.apache.fineract.portfolio.delinquency.domain.DelinquencyRange + org.apache.fineract.portfolio.charge.domain.Charge + org.apache.fineract.portfolio.paymenttype.domain.PaymentType + org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail + org.apache.fineract.portfolio.tax.domain.TaxGroup + org.apache.fineract.portfolio.tax.domain.TaxGroupMappings + org.apache.fineract.portfolio.tax.domain.TaxComponent + org.apache.fineract.portfolio.tax.domain.TaxComponentHistory + org.apache.fineract.portfolio.floatingrates.domain.FloatingRate + org.apache.fineract.portfolio.floatingrates.domain.FloatingRatePeriod + org.apache.fineract.portfolio.calendar.domain.Calendar + org.apache.fineract.portfolio.calendar.domain.CalendarHistory + org.apache.fineract.portfolio.calendar.domain.CalendarInstance + org.apache.fineract.useradministration.domain.AppUser + org.apache.fineract.useradministration.domain.Role + org.apache.fineract.useradministration.domain.Permission + org.apache.fineract.useradministration.domain.AppUserClientMapping + false + + + + + diff --git a/fineract-loan/src/test/java/.gitkeep b/fineract-loan/src/test/java/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/fineract-loan/src/test/resources/.gitkeep b/fineract-loan/src/test/resources/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/fineract-provider/dependencies.gradle b/fineract-provider/dependencies.gradle index d2cd3244a..63b5bf659 100644 --- a/fineract-provider/dependencies.gradle +++ b/fineract-provider/dependencies.gradle @@ -20,6 +20,7 @@ dependencies { implementation(project(path: ':fineract-core')) implementation(project(path: ':fineract-investor')) + implementation(project(path: ':fineract-loan')) providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") // Never use "compile" scope, but make all dependencies either 'implementation', 'runtimeOnly' or 'testCompile'. diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java index e1268e9a1..f7d755f5b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/auditing/CustomAuditingHandler.java @@ -60,8 +60,7 @@ public class CustomAuditingHandler extends AuditingHandler { } private DateTimeProvider fetchDateTimeProvider(Object bean) { - if (bean instanceof AbstractAuditableWithUTCDateTimeCustom - || bean instanceof org.apache.fineract.investor.domain.AbstractAuditableWithUTCDateTimeCustom) { + if (bean instanceof AbstractAuditableWithUTCDateTimeCustom) { return CustomDateTimeProvider.TENANT; } else { return CustomDateTimeProvider.INSTANCE; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/util/ConvertChargeDataToSpecificChargeData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/util/ConvertChargeDataToSpecificChargeData.java new file mode 100644 index 000000000..8f50d46c1 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/util/ConvertChargeDataToSpecificChargeData.java @@ -0,0 +1,94 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.charge.util; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Collection; +import org.apache.fineract.infrastructure.core.domain.ExternalId; +import org.apache.fineract.portfolio.charge.data.ChargeData; +import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData; +import org.apache.fineract.portfolio.savings.data.SavingsAccountChargeData; +import org.apache.fineract.portfolio.shareaccounts.data.ShareAccountChargeData; + +public final class ConvertChargeDataToSpecificChargeData { + + private ConvertChargeDataToSpecificChargeData() {} + + public static LoanChargeData toLoanChargeData(final ChargeData chargeData) { + + BigDecimal percentage = null; + if (chargeData.getChargeCalculationType().getId() == 2) { + percentage = chargeData.getAmount(); + } + + return LoanChargeData.newLoanChargeDetails(chargeData.getId(), chargeData.getName(), chargeData.getCurrency(), + chargeData.getAmount(), percentage, chargeData.getChargeTimeType(), chargeData.getChargeCalculationType(), + chargeData.isPenalty(), chargeData.getChargePaymentMode(), chargeData.getMinCap(), chargeData.getMaxCap(), + ExternalId.empty()); + } + + public static SavingsAccountChargeData toSavingsAccountChargeData(final ChargeData chargeData) { + + final Long savingsChargeId = null; + final Long savingsAccountId = null; + final BigDecimal amountPaid = BigDecimal.ZERO; + final BigDecimal amountWaived = BigDecimal.ZERO; + final BigDecimal amountWrittenOff = BigDecimal.ZERO; + final BigDecimal amountOutstanding = BigDecimal.ZERO; + final BigDecimal percentage = BigDecimal.ZERO; + final BigDecimal amountPercentageAppliedTo = BigDecimal.ZERO; + final Collection chargeOptions = null; + final LocalDate dueAsOfDate = null; + final Boolean isActive = null; + final Boolean isFreeWithdrawal = null; + final Integer freeWithdrawalChargeFrequency = null; + final Integer restartFrequency = null; + final Integer restartFrequencyEnum = null; + + final LocalDate inactivationDate = null; + + return SavingsAccountChargeData.instance(savingsChargeId, chargeData.getId(), savingsAccountId, chargeData.getName(), + chargeData.getCurrency(), chargeData.getAmount(), amountPaid, amountWaived, amountWrittenOff, amountOutstanding, + chargeData.getChargeTimeType(), dueAsOfDate, chargeData.getChargeCalculationType(), percentage, amountPercentageAppliedTo, + chargeOptions, chargeData.isPenalty(), chargeData.getFeeOnMonthDay(), chargeData.getFeeInterval(), isActive, + isFreeWithdrawal, freeWithdrawalChargeFrequency, restartFrequency, restartFrequencyEnum, inactivationDate); + } + + public static ShareAccountChargeData toShareAccountChargeData(final ChargeData chargeData) { + + final Long shareChargeId = null; + final Long shareAccountId = null; + final BigDecimal amountPaid = BigDecimal.ZERO; + final BigDecimal amountWaived = BigDecimal.ZERO; + final BigDecimal amountWrittenOff = BigDecimal.ZERO; + final BigDecimal amountOutstanding = BigDecimal.ZERO; + final BigDecimal percentage = BigDecimal.ZERO; + final BigDecimal amountPercentageAppliedTo = BigDecimal.ZERO; + final Collection chargeOptions = null; + final Boolean isActive = null; + final BigDecimal chargeAmountOrPercentage = BigDecimal.ZERO; + + return new ShareAccountChargeData(shareChargeId, chargeData.getId(), shareAccountId, chargeData.getName(), chargeData.getCurrency(), + chargeData.getAmount(), amountPaid, amountWaived, amountWrittenOff, amountOutstanding, chargeData.getChargeTimeType(), + chargeData.getChargeCalculationType(), percentage, amountPercentageAppliedTo, chargeOptions, isActive, + chargeAmountOrPercentage); + } + +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java index 855dc25b9..62ba40f5e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java @@ -308,8 +308,10 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService for (ClientCollateralManagement clientCollateralManagement : clientCollateralManagements) { BigDecimal total = clientCollateralManagement.getTotal(); BigDecimal totalCollateral = clientCollateralManagement.getTotalCollateral(total); - clientCollateralManagementDataSet - .add(ClientCollateralManagementData.setCollateralValues(clientCollateralManagement, total, totalCollateral)); + clientCollateralManagementDataSet.add(new ClientCollateralManagementData(clientCollateralManagement.getId(), + clientCollateralManagement.getCollaterals().getName(), clientCollateralManagement.getQuantity(), + clientCollateralManagement.getCollaterals().getPctToBase(), + clientCollateralManagement.getCollaterals().getBasePrice(), total, totalCollateral)); } final String clientGroupsSql = "select " + this.clientGroupsMapper.parentGroupsSchema(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java index 86b67aa10..2020af9e8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanAccountData.java @@ -41,6 +41,7 @@ import org.apache.fineract.portfolio.account.data.PortfolioAccountData; import org.apache.fineract.portfolio.accountdetails.data.LoanAccountSummaryData; import org.apache.fineract.portfolio.calendar.data.CalendarData; import org.apache.fineract.portfolio.charge.data.ChargeData; +import org.apache.fineract.portfolio.charge.util.ConvertChargeDataToSpecificChargeData; import org.apache.fineract.portfolio.delinquency.data.DelinquencyRangeData; import org.apache.fineract.portfolio.floatingrates.data.InterestRatePeriodData; import org.apache.fineract.portfolio.fund.data.FundData; @@ -472,7 +473,7 @@ public class LoanAccountData { final Collection charges = new ArrayList(); for (final ChargeData charge : product.charges()) { if (!charge.isOverdueInstallmentCharge()) { - charges.add(charge.toLoanChargeData()); + charges.add(ConvertChargeDataToSpecificChargeData.toLoanChargeData(charge)); } } @@ -565,7 +566,7 @@ public class LoanAccountData { final Collection charges = new ArrayList(); for (final ChargeData charge : product.charges()) { - charges.add(charge.toLoanChargeData()); + charges.add(ConvertChargeDataToSpecificChargeData.toLoanChargeData(charge)); } BigDecimal netDisbursalAmount = product.getPrincipal(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java index c78abf37f..45645e5e7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/FixedDepositAccount.java @@ -63,6 +63,7 @@ import org.apache.fineract.portfolio.savings.SavingsInterestCalculationType; import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType; import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType; import org.apache.fineract.portfolio.savings.domain.interest.PostingPeriod; +import org.apache.fineract.portfolio.savings.domain.interest.SavingsAccountTransactionDetailsForPostingPeriod; import org.apache.fineract.portfolio.savings.service.SavingsEnumerations; import org.apache.fineract.useradministration.domain.AppUser; @@ -317,15 +318,18 @@ public class FixedDepositAccount extends SavingsAccount { final Collection interestPostTransactions = this.savingsHelper.fetchPostInterestTransactionIds(getId()); boolean isInterestTransfer = false; final Money minBalanceForInterestCalculation = Money.of(getCurrency(), minBalanceForInterestCalculation()); + List savingsAccountTransactionDetailsForPostingPeriodList = toSavingsAccountTransactionDetailsForPostingPeriodList( + transactions); for (final LocalDateInterval periodInterval : postingPeriodIntervals) { boolean isUserPosting = false; if (postedAsOnTransactionDates.contains(periodInterval.endDate())) { isUserPosting = true; } - final PostingPeriod postingPeriod = PostingPeriod.createFrom(periodInterval, periodStartingBalance, transactions, this.currency, - compoundingPeriodType, interestCalculationType, interestRateAsFraction, daysInYearType.getValue(), maturityDate, - interestPostTransactions, isInterestTransfer, minBalanceForInterestCalculation, - isSavingsInterestPostingAtCurrentPeriodEnd, isUserPosting, financialYearBeginningMonth); + final PostingPeriod postingPeriod = PostingPeriod.createFrom(periodInterval, periodStartingBalance, + savingsAccountTransactionDetailsForPostingPeriodList, this.currency, compoundingPeriodType, interestCalculationType, + interestRateAsFraction, daysInYearType.getValue(), maturityDate, interestPostTransactions, isInterestTransfer, + minBalanceForInterestCalculation, isSavingsInterestPostingAtCurrentPeriodEnd, isUserPosting, + financialYearBeginningMonth); periodStartingBalance = postingPeriod.closingBalance(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java index a602e55ff..76d2d40a6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/RecurringDepositAccount.java @@ -69,6 +69,7 @@ import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType; import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionDTO; import org.apache.fineract.portfolio.savings.domain.interest.PostingPeriod; +import org.apache.fineract.portfolio.savings.domain.interest.SavingsAccountTransactionDetailsForPostingPeriod; import org.apache.fineract.portfolio.savings.service.SavingsEnumerations; import org.apache.fineract.useradministration.domain.AppUser; @@ -348,15 +349,18 @@ public class RecurringDepositAccount extends SavingsAccount { final Collection interestPostTransactions = this.savingsHelper.fetchPostInterestTransactionIds(getId()); boolean isInterestTransfer = false; final Money minBalanceForInterestCalculation = Money.of(getCurrency(), minBalanceForInterestCalculation()); + List savingsAccountTransactionDetailsForPostingPeriodList = toSavingsAccountTransactionDetailsForPostingPeriodList( + transactions); for (final LocalDateInterval periodInterval : postingPeriodIntervals) { boolean isUserPosting = false; if (PostedAsOnDates.contains(periodInterval.endDate())) { isUserPosting = true; } - final PostingPeriod postingPeriod = PostingPeriod.createFrom(periodInterval, periodStartingBalance, transactions, this.currency, - compoundingPeriodType, interestCalculationType, interestRateAsFraction, daysInYearType.getValue(), maturityDate, - interestPostTransactions, isInterestTransfer, minBalanceForInterestCalculation, - isSavingsInterestPostingAtCurrentPeriodEnd, isUserPosting, financialYearBeginningMonth); + final PostingPeriod postingPeriod = PostingPeriod.createFrom(periodInterval, periodStartingBalance, + savingsAccountTransactionDetailsForPostingPeriodList, this.currency, compoundingPeriodType, interestCalculationType, + interestRateAsFraction, daysInYearType.getValue(), maturityDate, interestPostTransactions, isInterestTransfer, + minBalanceForInterestCalculation, isSavingsInterestPostingAtCurrentPeriodEnd, isUserPosting, + financialYearBeginningMonth); periodStartingBalance = postingPeriod.closingBalance(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java index e5425c3a9..52a7581b4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java @@ -104,6 +104,7 @@ import org.apache.fineract.portfolio.savings.SavingsPeriodFrequencyType; import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionDTO; import org.apache.fineract.portfolio.savings.domain.interest.PostingPeriod; +import org.apache.fineract.portfolio.savings.domain.interest.SavingsAccountTransactionDetailsForPostingPeriod; import org.apache.fineract.portfolio.savings.exception.InsufficientAccountBalanceException; import org.apache.fineract.portfolio.savings.exception.SavingsAccountBlockedException; import org.apache.fineract.portfolio.savings.exception.SavingsAccountCreditsBlockedException; @@ -892,11 +893,14 @@ public class SavingsAccount extends AbstractPersistableCustom { orderedNonInterestPostingTransactions = retreiveOrderedNonInterestPostingTransactions(); } - postingPeriod = PostingPeriod.createFrom(periodInterval, periodStartingBalance, orderedNonInterestPostingTransactions, - this.currency, compoundingPeriodType, interestCalculationType, interestRateAsFraction, daysInYearType.getValue(), - upToInterestCalculationDate, interestPostTransactions, isInterestTransfer, minBalanceForInterestCalculation, - isSavingsInterestPostingAtCurrentPeriodEnd, overdraftInterestRateAsFraction, minOverdraftForInterestCalculation, - isUserPosting, financialYearBeginningMonth); + List savingsAccountTransactionDetailsForPostingPeriod = toSavingsAccountTransactionDetailsForPostingPeriodList( + orderedNonInterestPostingTransactions); + + postingPeriod = PostingPeriod.createFrom(periodInterval, periodStartingBalance, + savingsAccountTransactionDetailsForPostingPeriod, this.currency, compoundingPeriodType, interestCalculationType, + interestRateAsFraction, daysInYearType.getValue(), upToInterestCalculationDate, interestPostTransactions, + isInterestTransfer, minBalanceForInterestCalculation, isSavingsInterestPostingAtCurrentPeriodEnd, + overdraftInterestRateAsFraction, minOverdraftForInterestCalculation, isUserPosting, financialYearBeginningMonth); periodStartingBalance = postingPeriod.closingBalance(); @@ -3929,4 +3933,11 @@ public class SavingsAccount extends AbstractPersistableCustom { public boolean isWithHoldTax() { return this.withHoldTax; } + + public List toSavingsAccountTransactionDetailsForPostingPeriodList( + List transactions) { + return transactions.stream() + .map(transaction -> transaction.toSavingsAccountTransactionDetailsForPostingPeriod(this.currency, this.allowOverdraft)) + .toList(); + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java index 32fa95dba..ece7ef4c0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountAssembler.java @@ -89,6 +89,7 @@ public class SavingsAccountAssembler { private static final Logger LOG = LoggerFactory.getLogger(SavingsAccountAssembler.class); private final SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper; + private final SavingsAccountTransactionDataSummaryWrapper savingsAccountTransactionDataSummaryWrapper; private final SavingsHelper savingsHelper; private final ClientRepositoryWrapper clientRepository; private final GroupRepositoryWrapper groupRepository; @@ -102,6 +103,7 @@ public class SavingsAccountAssembler { @Autowired public SavingsAccountAssembler(final SavingsAccountTransactionSummaryWrapper savingsAccountTransactionSummaryWrapper, + final SavingsAccountTransactionDataSummaryWrapper savingsAccountTransactionDataSummaryWrapper, final ClientRepositoryWrapper clientRepository, final GroupRepositoryWrapper groupRepository, final StaffRepositoryWrapper staffRepository, final SavingsProductRepository savingProductRepository, final SavingsAccountRepositoryWrapper savingsAccountRepository, @@ -109,6 +111,7 @@ public class SavingsAccountAssembler { final AccountTransfersReadPlatformService accountTransfersReadPlatformService, final JdbcTemplate jdbcTemplate, final ConfigurationDomainService configurationDomainService) { this.savingsAccountTransactionSummaryWrapper = savingsAccountTransactionSummaryWrapper; + this.savingsAccountTransactionDataSummaryWrapper = savingsAccountTransactionDataSummaryWrapper; this.clientRepository = clientRepository; this.groupRepository = groupRepository; this.staffRepository = staffRepository; @@ -403,7 +406,7 @@ public class SavingsAccountAssembler { } else { account.getSummary().setRunningBalanceOnPivotDate(BigDecimal.ZERO); } - account.setHelpers(this.savingsAccountTransactionSummaryWrapper, this.savingsHelper); + account.setHelpers(this.savingsAccountTransactionDataSummaryWrapper, this.savingsHelper); return account; } @@ -474,6 +477,6 @@ public class SavingsAccountAssembler { } public void assignSavingAccountHelpers(final SavingsAccountData savingsAccountData) { - savingsAccountData.setHelpers(this.savingsAccountTransactionSummaryWrapper, this.savingsHelper); + savingsAccountData.setHelpers(this.savingsAccountTransactionDataSummaryWrapper, this.savingsHelper); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java index 21a5a1ee0..f1d92d3d2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java @@ -47,6 +47,7 @@ import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; import org.apache.fineract.portfolio.savings.SavingsAccountTransactionType; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionEnumData; import org.apache.fineract.portfolio.savings.domain.interest.EndOfDayBalance; +import org.apache.fineract.portfolio.savings.domain.interest.SavingsAccountTransactionDetailsForPostingPeriod; import org.apache.fineract.portfolio.savings.service.SavingsEnumerations; import org.apache.fineract.portfolio.tax.domain.TaxComponent; import org.apache.fineract.useradministration.domain.AppUser; @@ -926,4 +927,11 @@ public final class SavingsAccountTransaction extends AbstractPersistableCustom { public boolean isReversalTransaction() { return reversalTransaction; } + + public SavingsAccountTransactionDetailsForPostingPeriod toSavingsAccountTransactionDetailsForPostingPeriod(MonetaryCurrency currency, + boolean isAllowOverDraft) { + return new SavingsAccountTransactionDetailsForPostingPeriod(getId(), this.dateOf, this.balanceEndDate, this.runningBalance, + this.amount, currency, this.balanceNumberOfDays, isDeposit(), isWithdrawal(), isAllowOverDraft, + isChargeTransactionAndNotReversed(), isDividendPayoutAndNotReversed()); + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java index 82e9a2de5..62f7caf00 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java @@ -20,10 +20,8 @@ package org.apache.fineract.portfolio.savings.domain; import java.math.BigDecimal; import java.util.List; -import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.organisation.monetary.domain.Money; -import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionData; import org.springframework.stereotype.Component; /** @@ -44,16 +42,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalDeposits(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isDepositAndNotReversed() || transaction.isDividendPayoutAndNotReversed()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalWithdrawals(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -64,16 +52,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalWithdrawals(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isWithdrawal() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -84,16 +62,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalInterestPosted(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isInterestPostingAndNotReversed() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalInterestPosted(final MonetaryCurrency currency, final BigDecimal currentInterestPosted, final List savingsAccountTransactions) { Money total = Money.of(currency, currentInterestPosted); @@ -115,16 +83,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalWithdrawalFees(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isWithdrawalFeeAndNotReversed() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalAnnualFees(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -135,16 +93,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalAnnualFees(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isAnnualFeeAndNotReversed() && transaction.isNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalFeesCharge(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -155,16 +103,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalFeesCharge(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isFeeChargeAndNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalFeesChargeWaived(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -175,16 +113,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalFeesChargeWaived(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isWaiveFeeChargeAndNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalPenaltyCharge(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -195,16 +123,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalPenaltyCharge(final CurrencyData currency, final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isPenaltyChargeAndNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalPenaltyChargeWaived(final MonetaryCurrency currency, final List transactions) { Money total = Money.zero(currency); @@ -216,17 +134,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalPenaltyChargeWaived(final CurrencyData currency, - final List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isWaivePenaltyChargeAndNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalOverdraftInterest(MonetaryCurrency currency, BigDecimal overdraftPosted, List transactions) { Money total = Money.of(currency, overdraftPosted); @@ -248,16 +155,6 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalOverdraftInterest(CurrencyData currency, List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isOverdraftInterestAndNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } - public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, List transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -268,13 +165,4 @@ public final class SavingsAccountTransactionSummaryWrapper { return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalWithholdTaxWithdrawal(CurrencyData currency, List transactions) { - Money total = Money.zero(currency); - for (final SavingsAccountTransactionData transaction : transactions) { - if (transaction.isWithHoldTaxAndNotReversed() && !transaction.isReversalTransaction()) { - total = total.plus(transaction.getAmount()); - } - } - return total.getAmountDefaultedToNullIfZero(); - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java index 52bc1433d..0ed3fffba 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java @@ -53,6 +53,7 @@ import org.apache.fineract.portfolio.calendar.domain.CalendarType; import org.apache.fineract.portfolio.calendar.service.CalendarReadPlatformService; import org.apache.fineract.portfolio.charge.data.ChargeData; import org.apache.fineract.portfolio.charge.service.ChargeReadPlatformService; +import org.apache.fineract.portfolio.charge.util.ConvertChargeDataToSpecificChargeData; import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.service.ClientReadPlatformService; import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType; @@ -560,7 +561,7 @@ public class DepositAccountReadPlatformServiceImpl implements DepositAccountRead private Collection fromChargesToSavingsCharges(final Collection productCharges) { final Collection savingsCharges = new ArrayList<>(); for (final ChargeData chargeData : productCharges) { - final SavingsAccountChargeData savingsCharge = chargeData.toSavingsAccountChargeData(); + final SavingsAccountChargeData savingsCharge = ConvertChargeDataToSpecificChargeData.toSavingsAccountChargeData(chargeData); savingsCharges.add(savingsCharge); } return savingsCharges; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java index 9aa6e543e..0bce93194 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java @@ -51,6 +51,7 @@ import org.apache.fineract.organisation.staff.service.StaffReadPlatformService; import org.apache.fineract.portfolio.account.data.AccountTransferData; import org.apache.fineract.portfolio.charge.data.ChargeData; import org.apache.fineract.portfolio.charge.service.ChargeReadPlatformService; +import org.apache.fineract.portfolio.charge.util.ConvertChargeDataToSpecificChargeData; import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.service.ClientReadPlatformService; import org.apache.fineract.portfolio.group.data.GroupGeneralData; @@ -1238,7 +1239,7 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead private Collection fromChargesToSavingsCharges(final Collection productCharges) { final Collection savingsCharges = new ArrayList<>(); for (final ChargeData chargeData : productCharges) { - final SavingsAccountChargeData savingsCharge = chargeData.toSavingsAccountChargeData(); + final SavingsAccountChargeData savingsCharge = ConvertChargeDataToSpecificChargeData.toSavingsAccountChargeData(chargeData); savingsCharges.add(savingsCharge); } return savingsCharges; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java index e4faf2849..d763777b6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/service/ShareAccountReadPlatformServiceImpl.java @@ -42,6 +42,7 @@ import org.apache.fineract.portfolio.accounts.data.AccountData; import org.apache.fineract.portfolio.accounts.exceptions.ShareAccountNotFoundException; import org.apache.fineract.portfolio.charge.data.ChargeData; import org.apache.fineract.portfolio.charge.service.ChargeReadPlatformService; +import org.apache.fineract.portfolio.charge.util.ConvertChargeDataToSpecificChargeData; import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.service.ClientReadPlatformService; import org.apache.fineract.portfolio.products.constants.ProductsApiConstants; @@ -246,7 +247,7 @@ public class ShareAccountReadPlatformServiceImpl implements ShareAccountReadPlat public Collection convertChargesToShareAccountCharges(Collection productCharges) { final Collection savingsCharges = new ArrayList<>(); for (final ChargeData chargeData : productCharges) { - final ShareAccountChargeData savingsCharge = chargeData.toShareAccountChargeData(); + final ShareAccountChargeData savingsCharge = ConvertChargeDataToSpecificChargeData.toShareAccountChargeData(chargeData); savingsCharges.add(savingsCharge); } return savingsCharges; diff --git a/fineract-provider/src/main/resources/jpa/persistence.xml b/fineract-provider/src/main/resources/jpa/persistence.xml index 105688157..40eb0b48e 100644 --- a/fineract-provider/src/main/resources/jpa/persistence.xml +++ b/fineract-provider/src/main/resources/jpa/persistence.xml @@ -29,6 +29,79 @@ org.eclipse.persistence.jpa.PersistenceProvider + + org.apache.fineract.accounting.glaccount.domain.GLAccount + org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom + org.apache.fineract.infrastructure.core.domain.AbstractAuditableWithUTCDateTimeCustom + org.apache.fineract.infrastructure.codes.domain.Code + org.apache.fineract.infrastructure.codes.domain.CodeValue + org.apache.fineract.infrastructure.documentmanagement.domain.Image + org.apache.fineract.organisation.staff.domain.Staff + org.apache.fineract.organisation.office.domain.Office + org.apache.fineract.organisation.office.domain.OrganisationCurrency + org.apache.fineract.organisation.monetary.domain.ApplicationCurrency + org.apache.fineract.organisation.holiday.domain.Holiday + org.apache.fineract.organisation.workingdays.domain.WorkingDays + org.apache.fineract.portfolio.group.domain.Group + org.apache.fineract.portfolio.group.domain.GroupLevel + org.apache.fineract.portfolio.group.domain.StaffAssignmentHistory + org.apache.fineract.portfolio.group.domain.GroupRole + org.apache.fineract.portfolio.client.domain.Client + org.apache.fineract.portfolio.rate.domain.Rate + org.apache.fineract.portfolio.fund.domain.Fund + org.apache.fineract.portfolio.delinquency.domain.DelinquencyBucket + org.apache.fineract.portfolio.delinquency.domain.DelinquencyRange + org.apache.fineract.portfolio.charge.domain.Charge + org.apache.fineract.portfolio.paymenttype.domain.PaymentType + org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail + org.apache.fineract.portfolio.tax.domain.TaxGroup + org.apache.fineract.portfolio.tax.domain.TaxGroupMappings + org.apache.fineract.portfolio.tax.domain.TaxComponent + org.apache.fineract.portfolio.tax.domain.TaxComponentHistory + org.apache.fineract.portfolio.floatingrates.domain.FloatingRate + org.apache.fineract.portfolio.floatingrates.domain.FloatingRatePeriod + org.apache.fineract.portfolio.calendar.domain.Calendar + org.apache.fineract.portfolio.calendar.domain.CalendarHistory + org.apache.fineract.portfolio.calendar.domain.CalendarInstance + org.apache.fineract.useradministration.domain.AppUser + org.apache.fineract.useradministration.domain.Role + org.apache.fineract.useradministration.domain.Permission + org.apache.fineract.useradministration.domain.AppUserClientMapping + + org.apache.fineract.investor.domain.ExternalAssetOwner + org.apache.fineract.investor.domain.ExternalAssetOwnerTransfer + org.apache.fineract.investor.domain.ExternalAssetOwnerTransferLoanMapping + + org.apache.fineract.portfolio.collateral.domain.LoanCollateral + org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement + org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementDomain + org.apache.fineract.portfolio.loanaccount.domain.GroupLoanIndividualMonitoringAccount + org.apache.fineract.portfolio.loanaccount.domain.Loan + org.apache.fineract.portfolio.loanaccount.domain.LoanCharge + org.apache.fineract.portfolio.loanaccount.domain.LoanChargePaidBy + org.apache.fineract.portfolio.loanaccount.domain.LoanCollateralManagement + org.apache.fineract.portfolio.loanaccount.domain.LoanDisbursementDetails + org.apache.fineract.portfolio.loanaccount.domain.LoanInstallmentCharge + org.apache.fineract.portfolio.loanaccount.domain.LoanInterestRecalculationDetails + org.apache.fineract.portfolio.loanaccount.domain.LoanInterestRecalcualtionAdditionalDetails + org.apache.fineract.portfolio.loanaccount.domain.LoanOfficerAssignmentHistory + org.apache.fineract.portfolio.loanaccount.domain.LoanOverdueInstallmentCharge + org.apache.fineract.portfolio.loanaccount.domain.LoanRepaymentScheduleInstallment + org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariations + org.apache.fineract.portfolio.loanaccount.domain.LoanTopupDetails + org.apache.fineract.portfolio.loanaccount.domain.LoanTrancheCharge + org.apache.fineract.portfolio.loanaccount.domain.LoanTrancheDisbursementCharge + org.apache.fineract.portfolio.loanaccount.domain.LoanTransaction + org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionRelation + org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionToRepaymentScheduleMapping + org.apache.fineract.portfolio.loanproduct.domain.LoanProduct + org.apache.fineract.portfolio.loanproduct.domain.LoanProductBorrowerCycleVariations + org.apache.fineract.portfolio.loanproduct.domain.LoanProductConfigurableAttributes + org.apache.fineract.portfolio.loanproduct.domain.LoanProductFloatingRates + org.apache.fineract.portfolio.loanproduct.domain.LoanProductGuaranteeDetails + org.apache.fineract.portfolio.loanproduct.domain.LoanProductInterestRecalculationDetails + org.apache.fineract.portfolio.loanproduct.domain.LoanProductVariableInstallmentConfig + org.apache.fineract.portfolio.repaymentwithpostdatedchecks.domain.PostDatedChecks false diff --git a/fineract-war/build.gradle b/fineract-war/build.gradle index 82ec98556..113d6a978 100644 --- a/fineract-war/build.gradle +++ b/fineract-war/build.gradle @@ -50,6 +50,7 @@ war { dependencies { implementation project(':fineract-core') implementation project(':fineract-investor') + implementation project(':fineract-loan') implementation project(':fineract-provider') } diff --git a/integration-tests/dependencies.gradle b/integration-tests/dependencies.gradle index 64223fa74..b46b15b7a 100644 --- a/integration-tests/dependencies.gradle +++ b/integration-tests/dependencies.gradle @@ -24,6 +24,7 @@ dependencies { testImplementation( files("$rootDir/fineract-provider/build/classes/java/main/"), project(path: ':fineract-core', configuration: 'runtimeElements'), project(path: ':fineract-investor', configuration: 'runtimeElements'), + project(path: ':fineract-loan', configuration: 'runtimeElements'), project(path: ':fineract-provider', configuration: 'runtimeElements'), project(path: ':fineract-avro-schemas', configuration: 'runtimeElements'), project(path: ':fineract-client', configuration: 'runtimeElements'), diff --git a/settings.gradle b/settings.gradle index 85f504611..1c3d774b3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,6 +20,7 @@ rootProject.name='fineract' include ':fineract-core' include ':fineract-provider' include ':fineract-investor' +include ':fineract-loan' include ':fineract-war' include ':integration-tests' include ':twofactor-tests'