http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java index 5ec2ad8..5aa6fe5 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java @@ -19,7 +19,6 @@ package org.apache.fineract.portfolio.charge.domain; public enum ChargeTimeType { - INVALID(0, "chargeTimeType.invalid"), // DISBURSEMENT(1, "chargeTimeType.disbursement"), // only for loan charges SPECIFIED_DUE_DATE(2, "chargeTimeType.specifiedDueDate"), // for loan and @@ -30,9 +29,13 @@ public enum ChargeTimeType { MONTHLY_FEE(7, "chargeTimeType.monthlyFee"), // only for savings INSTALMENT_FEE(8, "chargeTimeType.instalmentFee"), // only for loan charges OVERDUE_INSTALLMENT(9, "chargeTimeType.overdueInstallment"), // only for - OVERDRAFT_FEE(10, "chargeTimeType.overdraftFee"),// only for savings + OVERDRAFT_FEE(10, "chargeTimeType.overdraftFee"), // only for savings WEEKLY_FEE(11, "chargeTimeType.weeklyFee"), // only for savings - TRANCHE_DISBURSEMENT(12,"chargeTimeType.tranchedisbursement"); // only for loan + TRANCHE_DISBURSEMENT(12, "chargeTimeType.tranchedisbursement"), // only for + // loan + SHAREACCOUNT_ACTIVATION(13, "chargeTimeType.activation"), // only for loan + SHARE_PURCHASE(14, "chargeTimeType.sharespurchase"), + SHARE_REDEEM(15, "chargeTimeType.sharesredeem"); private final Integer value; private final String code; @@ -52,7 +55,8 @@ public enum ChargeTimeType { public static Object[] validLoanValues() { return new Integer[] { ChargeTimeType.DISBURSEMENT.getValue(), ChargeTimeType.SPECIFIED_DUE_DATE.getValue(), - ChargeTimeType.INSTALMENT_FEE.getValue(), ChargeTimeType.OVERDUE_INSTALLMENT.getValue(), ChargeTimeType.TRANCHE_DISBURSEMENT.getValue() }; + ChargeTimeType.INSTALMENT_FEE.getValue(), ChargeTimeType.OVERDUE_INSTALLMENT.getValue(), + ChargeTimeType.TRANCHE_DISBURSEMENT.getValue() }; } public static Object[] validLoanChargeValues() { @@ -70,6 +74,10 @@ public enum ChargeTimeType { return new Integer[] { ChargeTimeType.SPECIFIED_DUE_DATE.getValue() }; } + public static Object[] validShareValues() { + return new Integer[] { ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue(), ChargeTimeType.SHARE_PURCHASE.getValue(), ChargeTimeType.SHARE_REDEEM.getValue() }; + } + public static ChargeTimeType fromInt(final Integer chargeTime) { ChargeTimeType chargeTimeType = ChargeTimeType.INVALID; if (chargeTime != null) { @@ -110,6 +118,15 @@ public enum ChargeTimeType { case 12: chargeTimeType = TRANCHE_DISBURSEMENT; break; + case 13: + chargeTimeType = SHAREACCOUNT_ACTIVATION; + break; + case 14: + chargeTimeType = SHARE_PURCHASE; + break; + case 15: + chargeTimeType = SHARE_REDEEM; + break; default: chargeTimeType = INVALID; break; @@ -167,16 +184,27 @@ public enum ChargeTimeType { } public boolean isAllowedSavingsChargeTime() { - return isOnSpecifiedDueDate() || isSavingsActivation() || isSavingsClosure() || isWithdrawalFee() || isAnnualFee() || isMonthlyFee() - || isWeeklyFee() || isOverdraftFee(); + return isOnSpecifiedDueDate() || isSavingsActivation() || isSavingsClosure() || isWithdrawalFee() || isAnnualFee() + || isMonthlyFee() || isWeeklyFee() || isOverdraftFee(); } public boolean isOverdraftFee() { return this.value.equals(ChargeTimeType.OVERDRAFT_FEE.getValue()); } - - public boolean isTrancheDisbursement(){ - return this.value.equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue()); + + public boolean isTrancheDisbursement() { + return this.value.equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue()); + } + + public boolean isShareAccountActivation() { + return this.value.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue()); } + public boolean isSharesPurchase() { + return this.value.equals(ChargeTimeType.SHARE_PURCHASE.getValue()); + } + + public boolean isSharesRedeem() { + return this.value.equals(ChargeTimeType.SHARE_REDEEM.getValue()); + } } \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java new file mode 100644 index 0000000..199e776 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/exception/ShareAccountChargeWithoutMandatoryFieldException.java @@ -0,0 +1,34 @@ +/** + * 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.exception; + +import org.apache.fineract.infrastructure.core.exception.AbstractPlatformDomainRuleException; + +/** + * {@link AbstractPlatformDomainRuleException} thrown when currency mismatch + * occurs + */ +public class ShareAccountChargeWithoutMandatoryFieldException extends AbstractPlatformDomainRuleException { + + public ShareAccountChargeWithoutMandatoryFieldException(final String entity, final String postFix, final String defaultUserMessage, + final Object... defaultUserMessageArgs) { + super("error.msg." + entity + "." + postFix + ".cannot.be.blank", defaultUserMessage, defaultUserMessageArgs); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java index bbf18ba..d58acc3 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/serialization/ChargeDefinitionCommandFromApiJsonDeserializer.java @@ -176,6 +176,25 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { .longGreaterThanZero(); } + }else if(appliesTo.isSharesCharge()) { + final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element); + baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull(); + if (chargeTimeType != null) { + baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType) + .isOneOfTheseValues(ChargeTimeType.validShareValues()); + } + + if (chargeCalculationType != null) { + baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + .isOneOfTheseValues(ChargeCalculationType.validValuesForShares()); + } + + if(chargeTimeType != null && chargeTimeType.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue())) { + if(chargeCalculationType != null) { + baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + .isOneOfTheseValues(ChargeCalculationType.validValuesForShareAccountActivation()); + } + } } final String name = this.fromApiJsonHelper.extractStringNamed("name", element); @@ -263,11 +282,11 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { final Collection<Object> validLoanValues = Arrays.asList(ChargeTimeType.validLoanValues()); final Collection<Object> validSavingsValues = Arrays.asList(ChargeTimeType.validSavingsValues()); final Collection<Object> validClientValues = Arrays.asList(ChargeTimeType.validClientValues()); - + final Collection<Object> validShareValues = Arrays.asList(ChargeTimeType.validShareValues()) ; final Collection<Object> allValidValues = new ArrayList<>(validLoanValues); allValidValues.addAll(validSavingsValues); allValidValues.addAll(validClientValues); - + allValidValues.addAll(validShareValues) ; baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull() .isOneOfTheseValues(allValidValues.toArray(new Object[allValidValues.size()])); } @@ -281,13 +300,13 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { final Integer feeInterval = this.fromApiJsonHelper.extractIntegerNamed("feeInterval", element, Locale.getDefault()); baseDataValidator.reset().parameter("feeInterval").value(feeInterval).integerGreaterThanZero(); } - + if (this.fromApiJsonHelper.parameterExists("chargeCalculationType", element)) { final Integer chargeCalculationType = this.fromApiJsonHelper.extractIntegerNamed("chargeCalculationType", element, Locale.getDefault()); baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType).notNull().inMinMaxRange(1, 5); } - + if (this.fromApiJsonHelper.parameterExists("chargePaymentMode", element)) { final Integer chargePaymentMode = this.fromApiJsonHelper.extractIntegerNamed("chargePaymentMode", element, Locale.getDefault()); baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode).notNull().inMinMaxRange(0, 1); @@ -338,6 +357,11 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer { private void performChargeTimeNCalculationTypeValidation(DataValidatorBuilder baseDataValidator, final Integer chargeTimeType, final Integer chargeCalculationType) { + if(chargeTimeType.equals(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue())){ + baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) + .isOneOfTheseValues(ChargeCalculationType.validValuesForShareAccountActivation()); + } + if (chargeTimeType.equals(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue())) { baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType) .isOneOfTheseValues(ChargeCalculationType.validValuesForTrancheDisbursement()); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java index 18ff74b..4d36e07 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformService.java @@ -42,4 +42,8 @@ public interface ChargeDropdownReadPlatformService { List<EnumOptionData> retrieveClientCalculationTypes(); List<EnumOptionData> retrieveClientCollectionTimeTypes(); + + List<EnumOptionData> retrieveSharesCalculationTypes() ; + List<EnumOptionData> retrieveSharesCollectionTimeTypes() ; + } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java index 8b5c68a..be5753b 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeDropdownReadPlatformServiceImpl.java @@ -114,4 +114,16 @@ public class ChargeDropdownReadPlatformServiceImpl implements ChargeDropdownRead public List<EnumOptionData> retrieveClientCollectionTimeTypes() { return Arrays.asList(chargeTimeType(ChargeTimeType.SPECIFIED_DUE_DATE)); } + + @Override + public List<EnumOptionData> retrieveSharesCalculationTypes() { + return Arrays.asList(chargeCalculationType(ChargeCalculationType.FLAT), + chargeCalculationType(ChargeCalculationType.PERCENT_OF_AMOUNT)); + } + + @Override + public List<EnumOptionData> retrieveSharesCollectionTimeTypes() { + return Arrays.asList(chargeTimeType(ChargeTimeType.SHAREACCOUNT_ACTIVATION), + chargeTimeType(ChargeTimeType.SHARE_PURCHASE), chargeTimeType(ChargeTimeType.SHARE_REDEEM)); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java index 68cabfd..0099be5 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeEnumerations.java @@ -81,6 +81,16 @@ public class ChargeEnumerations { optionData = new EnumOptionData(ChargeTimeType.TRANCHE_DISBURSEMENT.getValue().longValue(), ChargeTimeType.TRANCHE_DISBURSEMENT.getCode(), "Tranche Disbursement"); break; + case SHAREACCOUNT_ACTIVATION: + optionData = new EnumOptionData(ChargeTimeType.SHAREACCOUNT_ACTIVATION.getValue().longValue(), ChargeTimeType.SHAREACCOUNT_ACTIVATION.getCode(), "Share Account Activate") ; + break ; + + case SHARE_PURCHASE: + optionData = new EnumOptionData(ChargeTimeType.SHARE_PURCHASE.getValue().longValue(), ChargeTimeType.SHARE_PURCHASE.getCode(), "Share Purchase") ; + break ; + case SHARE_REDEEM: + optionData = new EnumOptionData(ChargeTimeType.SHARE_REDEEM.getValue().longValue(), ChargeTimeType.SHARE_REDEEM.getCode(), "Share Redeem") ; + break ; default: optionData = new EnumOptionData(ChargeTimeType.INVALID.getValue().longValue(), ChargeTimeType.INVALID.getCode(), "Invalid"); break; @@ -105,6 +115,9 @@ public class ChargeEnumerations { case CLIENT: optionData = new EnumOptionData(ChargeAppliesTo.CLIENT.getValue().longValue(), ChargeAppliesTo.CLIENT.getCode(), "Client"); break; + case SHARES: + optionData = new EnumOptionData(ChargeAppliesTo.SHARES.getValue().longValue(), ChargeAppliesTo.SHARES.getCode(), "Shares") ; + break ; default: optionData = new EnumOptionData(ChargeAppliesTo.INVALID.getValue().longValue(), ChargeAppliesTo.INVALID.getCode(), "Invalid"); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java index 677e5d4..cd675af 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformService.java @@ -116,5 +116,11 @@ public interface ChargeReadPlatformService { /** Retrieve savings account charges **/ Collection<ChargeData> retrieveSavingsAccountApplicableCharges(Long savingsId); + + /** + * Returns charge definitions which are applicable for shares + */ + Collection<ChargeData> retrieveSharesApplicableCharges(); + public Collection<ChargeData> retrieveShareProductCharges(final Long shareProductId) ; } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java index 542e471..dcc4105 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/service/ChargeReadPlatformServiceImpl.java @@ -147,11 +147,15 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService final List<EnumOptionData> feeFrequencyOptions = this.dropdownReadPlatformService.retrievePeriodFrequencyTypeOptions(); final Map<String, List<GLAccountData>> incomeOrLiabilityAccountOptions = this.accountingDropdownReadPlatformService .retrieveAccountMappingOptionsForCharges(); + final List<EnumOptionData> shareChargeCalculationTypeOptions = this.chargeDropdownReadPlatformService + .retrieveSharesCalculationTypes(); + final List<EnumOptionData> shareChargeTimeTypeOptions = this.chargeDropdownReadPlatformService.retrieveSharesCollectionTimeTypes(); final Collection<TaxGroupData> taxGroupOptions = this.taxReadPlatformService.retrieveTaxGroupsForLookUp(); return ChargeData.template(currencyOptions, allowedChargeCalculationTypeOptions, allowedChargeAppliesToOptions, allowedChargeTimeOptions, chargePaymentOptions, loansChargeCalculationTypeOptions, loansChargeTimeTypeOptions, savingsChargeCalculationTypeOptions, savingsChargeTimeTypeOptions, clientChargeCalculationTypeOptions, - clientChargeTimeTypeOptions, feeFrequencyOptions, incomeOrLiabilityAccountOptions, taxGroupOptions); + clientChargeTimeTypeOptions, feeFrequencyOptions, incomeOrLiabilityAccountOptions, taxGroupOptions, + shareChargeCalculationTypeOptions, shareChargeTimeTypeOptions); } @Override @@ -292,6 +296,10 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService return chargeSchema() + " join m_savings_product_charge spc on spc.charge_id = c.id"; } + public String shareProductChargeSchema() { + return chargeSchema() + " join m_share_product_charge mspc on mspc.charge_id = c.id"; + } + @Override public ChargeData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { final Long id = rs.getLong("id"); @@ -397,6 +405,16 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService } @Override + public Collection<ChargeData> retrieveShareProductCharges(final Long shareProductId) { + final ChargeMapper rm = new ChargeMapper(); + + String sql = "select " + rm.shareProductChargeSchema() + " where c.is_deleted=0 and c.is_active=1 and mspc.product_id=? "; + sql += addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled(); + + return this.jdbcTemplate.query(sql, rm, new Object[] { shareProductId }); + } + + @Override public Collection<ChargeData> retrieveSavingsAccountApplicableCharges(Long savingsAccountId) { final ChargeMapper rm = new ChargeMapper(); @@ -419,4 +437,13 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService return this.jdbcTemplate.query(sql, rm, new Object[] { ChargeAppliesTo.CLIENT.getValue() }); } + @Override + public Collection<ChargeData> retrieveSharesApplicableCharges() { + final ChargeMapper rm = new ChargeMapper(); + String sql = "select " + rm.chargeSchema() + " where c.is_deleted=0 and c.is_active=1 and c.charge_applies_to_enum=? "; + sql += addInClauseToSQL_toLimitChargesMappedToOffice_ifOfficeSpecificProductsEnabled(); + sql += " order by c.name "; + + return this.jdbcTemplate.query(sql, rm, new Object[] { ChargeAppliesTo.SHARES.getValue() }); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java index 21aba2e..c464470 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java @@ -299,7 +299,7 @@ public class ClientsApiResource { final AccountSummaryCollectionData clientAccount = this.accountDetailsReadPlatformService.retrieveClientAccountDetails(clientId); - final Set<String> CLIENT_ACCOUNTS_DATA_PARAMETERS = new HashSet<>(Arrays.asList("loanAccounts", "savingsAccounts")); + final Set<String> CLIENT_ACCOUNTS_DATA_PARAMETERS = new HashSet<>(Arrays.asList("loanAccounts", "savingsAccounts", "shareAccounts")); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.clientAccountSummaryToApiJsonSerializer.serialize(settings, clientAccount, CLIENT_ACCOUNTS_DATA_PARAMETERS); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java index c251d1a..e977114 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/AccountNumberGenerator.java @@ -28,6 +28,7 @@ import org.apache.fineract.infrastructure.codes.domain.CodeValue; import org.apache.fineract.portfolio.group.domain.Group; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; +import org.apache.fineract.portfolio.shareaccounts.domain.ShareAccount; import org.springframework.stereotype.Component; /** @@ -45,7 +46,8 @@ public class AccountNumberGenerator { private final static String OFFICE_NAME = "officeName"; private final static String LOAN_PRODUCT_SHORT_NAME = "loanProductShortName"; private final static String SAVINGS_PRODUCT_SHORT_NAME = "savingsProductShortName"; - + private final static String SHARE_PRODUCT_SHORT_NAME = "sharesProductShortName" ; + public String generate(Client client, AccountNumberFormat accountNumberFormat) { Map<String, String> propertyMap = new HashMap<>(); propertyMap.put(ID, client.getId().toString()); @@ -73,6 +75,13 @@ public class AccountNumberGenerator { return generateAccountNumber(propertyMap, accountNumberFormat); } + public String generate(ShareAccount shareaccount, AccountNumberFormat accountNumberFormat) { + Map<String, String> propertyMap = new HashMap<>(); + propertyMap.put(ID, shareaccount.getId().toString()); + propertyMap.put(SHARE_PRODUCT_SHORT_NAME, shareaccount.getShareProduct().getShortName()); + return generateAccountNumber(propertyMap, accountNumberFormat) ; + } + private String generateAccountNumber(Map<String, String> propertyMap, AccountNumberFormat accountNumberFormat) { String accountNumber = StringUtils.leftPad(propertyMap.get(ID), AccountNumberGenerator.maxLength, '0'); if (accountNumberFormat != null && accountNumberFormat.getPrefixEnum() != null) { http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java index 0c80ce3..c4ce470 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java @@ -157,12 +157,13 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform final List<EnumOptionData> feeFrequencyOptions = this.dropdownReadPlatformService.retrievePeriodFrequencyTypeOptions(); // this field is applicable only for client charges final Map<String, List<GLAccountData>> incomeOrLiabilityAccountOptions = null; + final List<EnumOptionData> shareChargeCalculationTypeOptions = null ; + final List<EnumOptionData> shareChargeTimeTypeOptions = null ; final Collection<TaxGroupData> taxGroupOptions = null; - return ChargeData.template(null, allowedChargeCalculationTypeOptions, null, allowedChargeTimeOptions, null, loansChargeCalculationTypeOptions, loansChargeTimeTypeOptions, savingsChargeCalculationTypeOptions, savingsChargeTimeTypeOptions, clientChargeCalculationTypeOptions, clientChargeTimeTypeOptions, feeFrequencyOptions, - incomeOrLiabilityAccountOptions, taxGroupOptions); + incomeOrLiabilityAccountOptions, taxGroupOptions, shareChargeCalculationTypeOptions, shareChargeTimeTypeOptions); } @Override http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java index 5f58b36..9baddda 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java @@ -18,9 +18,6 @@ */ package org.apache.fineract.portfolio.products.api; -import java.util.Collection; -import java.util.HashSet; - import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -41,80 +38,85 @@ import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; +import org.apache.fineract.infrastructure.core.service.Page; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.products.constants.ProductsApiConstants; import org.apache.fineract.portfolio.products.data.ProductData; -import org.apache.fineract.portfolio.products.service.ProductCommandsService; import org.apache.fineract.portfolio.products.service.ProductReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; - @Path("/products/{type}") @Component @Scope("singleton") public class ProductsApiResource { - private final ApplicationContext applicationContext ; + private final ApplicationContext applicationContext; private final ApiRequestParameterHelper apiRequestParameterHelper; private final DefaultToApiJsonSerializer<ProductData> toApiJsonSerializer; - private final DefaultToApiJsonSerializer<Object> toApiObjectJsonSerializer ; + private final DefaultToApiJsonSerializer<Object> toApiObjectJsonSerializer; private final PlatformSecurityContext platformSecurityContext; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; - + @Autowired - public ProductsApiResource(final ApplicationContext applicationContext, - final ApiRequestParameterHelper apiRequestParameterHelper, - final DefaultToApiJsonSerializer<ProductData> toApiJsonSerializer, - final PlatformSecurityContext platformSecurityContext, + public ProductsApiResource(final ApplicationContext applicationContext, final ApiRequestParameterHelper apiRequestParameterHelper, + final DefaultToApiJsonSerializer<ProductData> toApiJsonSerializer, final PlatformSecurityContext platformSecurityContext, final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, final DefaultToApiJsonSerializer<Object> toApiDividendsJsonSerializer) { - this.applicationContext = applicationContext ; - this.apiRequestParameterHelper = apiRequestParameterHelper ; - this.toApiJsonSerializer = toApiJsonSerializer ; - this.platformSecurityContext = platformSecurityContext ; - this.commandsSourceWritePlatformService = commandsSourceWritePlatformService ; - this.toApiObjectJsonSerializer = toApiDividendsJsonSerializer ; + this.applicationContext = applicationContext; + this.apiRequestParameterHelper = apiRequestParameterHelper; + this.toApiJsonSerializer = toApiJsonSerializer; + this.platformSecurityContext = platformSecurityContext; + this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; + this.toApiObjectJsonSerializer = toApiDividendsJsonSerializer; } - + @GET @Path("template") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String retrieveTemplate(@PathParam("type") final String productType, @Context final UriInfo uriInfo) { - String serviceName = productType+ProductsApiConstants.READPLATFORM_NAME ; - ProductReadPlatformService service = (ProductReadPlatformService) this.applicationContext.getBean(serviceName) ; - ProductData data = service.retrieveTemplate() ; + String serviceName = productType + ProductsApiConstants.READPLATFORM_NAME; + ProductReadPlatformService service = (ProductReadPlatformService) this.applicationContext.getBean(serviceName); + ProductData data = service.retrieveTemplate(); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializer.serialize(settings, data, service.getResponseDataParams()); } - + @GET @Path("{productId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) public String retrieveProduct(@PathParam("productId") final Long productId, @PathParam("type") final String productType, @Context final UriInfo uriInfo) { - String serviceName = productType+ProductsApiConstants.READPLATFORM_NAME ; - ProductReadPlatformService service = (ProductReadPlatformService) this.applicationContext.getBean(serviceName) ; - ProductData data = service.retrieveOne(productId) ; + String serviceName = productType + ProductsApiConstants.READPLATFORM_NAME; + ProductReadPlatformService service = (ProductReadPlatformService) this.applicationContext.getBean(serviceName); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + + ProductData data = service.retrieveOne(productId, settings.isTemplate()); + return this.toApiJsonSerializer.serialize(settings, data, service.getResponseDataParams()); } - + @GET @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String retrieveAllProducts(@PathParam("type") final String productType, @Context final UriInfo uriInfo) { - String serviceName = productType+ProductsApiConstants.READPLATFORM_NAME ; - ProductReadPlatformService service = (ProductReadPlatformService) this.applicationContext.getBean(serviceName) ; - Collection<ProductData> data = service.retrieveAllProducts() ; + public String retrieveAllProducts(/* + * @PathParam("type") final String + * productType, @Context final UriInfo + * uriInfo + */ + @PathParam("type") final String productType, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, + @Context final UriInfo uriInfo) { + String serviceName = productType + ProductsApiConstants.READPLATFORM_NAME; + ProductReadPlatformService service = (ProductReadPlatformService) this.applicationContext.getBean(serviceName); + Page<ProductData> data = service.retrieveAllProducts(offset, limit); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiJsonSerializer.serialize(settings, data, service.getResponseDataParams()); + return this.toApiJsonSerializer.serialize(settings, data, service.getResponseDataParams()); } - + @POST @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) @@ -125,32 +127,32 @@ public class ProductsApiResource { final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); return this.toApiJsonSerializer.serialize(commandProcessingResult); } - + @POST @Path("{productId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String handleCommands(@PathParam("type") final String productType, @PathParam("productId") final Long productId, @QueryParam("command") final String commandParam, - @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) { - String serviceName = productType.toUpperCase()+ProductsApiConstants.PRODUCT_COMMANDSERVICE ; - ProductCommandsService service = (ProductCommandsService) this.applicationContext.getBean(serviceName) ; - final Object obj = service.handleCommand(productId, commandParam, apiRequestBodyAsJson) ; - final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - return this.toApiObjectJsonSerializer.serialize(settings, obj, new HashSet<String>()); + public String handleCommands(@PathParam("type") final String productType, @PathParam("productId") final Long productId, + @QueryParam("command") final String commandParam, @SuppressWarnings("unused") @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) { + CommandWrapper commandWrapper = new CommandWrapperBuilder().createProductCommand(productType, commandParam, productId) + .withJson(apiRequestBodyAsJson).build(); + final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); + return this.toApiJsonSerializer.serialize(commandProcessingResult); } - + @PUT @Path("{productId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String updateProduct(@PathParam("type") final String productType, @PathParam("productId") final Long productId, final String apiRequestBodyAsJson) { + public String updateProduct(@PathParam("type") final String productType, @PathParam("productId") final Long productId, + final String apiRequestBodyAsJson) { this.platformSecurityContext.authenticatedUser(); final CommandWrapper commandRequest = new CommandWrapperBuilder().updateProduct(productType, productId) .withJson(apiRequestBodyAsJson).build(); final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); return this.toApiJsonSerializer.serialize(result); } - + private boolean is(final String commandParam, final String commandValue) { return StringUtils.isNotBlank(commandParam) && commandParam.trim().equalsIgnoreCase(commandValue); } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java index 5c93948..e0ae46a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/service/ProductReadPlatformService.java @@ -21,15 +21,18 @@ package org.apache.fineract.portfolio.products.service; import java.util.Collection; import java.util.Set; +import org.apache.fineract.infrastructure.core.service.Page; import org.apache.fineract.portfolio.products.data.ProductData; public interface ProductReadPlatformService { - public Collection<ProductData> retrieveAllProducts(); + public Page<ProductData> retrieveAllProducts(Integer offSet, Integer limit); - public ProductData retrieveOne(final Long productId); + public ProductData retrieveOne(final Long productId, boolean includeTemplate); public ProductData retrieveTemplate(); public Set<String> getResponseDataParams(); + + public Collection<ProductData> retrieveAllForLookup() ; } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java index f326b08..057f883 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsAccountTransactionType.java @@ -34,6 +34,7 @@ public enum SavingsAccountTransactionType { ANNUAL_FEE(5, "savingsAccountTransactionType.annualFee"), // WAIVE_CHARGES(6, "savingsAccountTransactionType.waiveCharge"), // PAY_CHARGE(7, "savingsAccountTransactionType.payCharge"), // + DIVIDEND_PAYOUT(8, "savingsAccountTransactionType.dividendPayout"), // INITIATE_TRANSFER(12, "savingsAccountTransactionType.initiateTransfer"), // APPROVE_TRANSFER(13, "savingsAccountTransactionType.approveTransfer"), // WITHDRAW_TRANSFER(14, "savingsAccountTransactionType.withdrawTransfer"), // @@ -84,6 +85,9 @@ public enum SavingsAccountTransactionType { case 7: savingsAccountTransactionType = SavingsAccountTransactionType.PAY_CHARGE; break; + case 8: + savingsAccountTransactionType = SavingsAccountTransactionType.DIVIDEND_PAYOUT; + break; case 12: savingsAccountTransactionType = SavingsAccountTransactionType.INITIATE_TRANSFER; break; @@ -165,6 +169,10 @@ public enum SavingsAccountTransactionType { return this.value.equals(SavingsAccountTransactionType.WRITTEN_OFF.getValue()); } + public boolean isDividendPayout() { + return this.value.equals(SavingsAccountTransactionType.DIVIDEND_PAYOUT.getValue()); + } + public boolean isIncomeFromInterest() { return this.value.equals(SavingsAccountTransactionType.OVERDRAFT_INTEREST.getValue()); } @@ -174,6 +182,6 @@ public enum SavingsAccountTransactionType { } public boolean isCredit() { - return isDeposit() || isInterestPosting(); + return isDeposit() || isInterestPosting() || isDividendPayout(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java index d4b9cf1..e7da011 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionEnumData.java @@ -31,6 +31,7 @@ public class SavingsAccountTransactionEnumData { private final String value; private final boolean deposit; + private final boolean dividendPayout; private final boolean withdrawal; private final boolean interestPosting; private final boolean feeDeduction; @@ -48,6 +49,7 @@ public class SavingsAccountTransactionEnumData { this.code = code; this.value = value; this.deposit = Long.valueOf(SavingsAccountTransactionType.DEPOSIT.getValue()).equals(this.id); + this.dividendPayout = Long.valueOf(SavingsAccountTransactionType.DIVIDEND_PAYOUT.getValue()).equals(this.id); this.withdrawal = Long.valueOf(SavingsAccountTransactionType.WITHDRAWAL.getValue()).equals(this.id); this.interestPosting = Long.valueOf(SavingsAccountTransactionType.INTEREST_POSTING.getValue()).equals(this.id); this.feeDeduction = Long.valueOf(SavingsAccountTransactionType.ANNUAL_FEE.getValue()).equals(this.id) @@ -127,5 +129,9 @@ public class SavingsAccountTransactionEnumData { public boolean isWithholdTax() { return this.withholdTax; } + + public boolean isDividendPayout() { + return this.dividendPayout; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccount.java ---------------------------------------------------------------------- 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 053f438..5cc2065 100755 --- 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 @@ -88,6 +88,7 @@ import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType; import org.apache.fineract.portfolio.group.domain.Group; import org.apache.fineract.portfolio.savings.DepositAccountType; +import org.apache.fineract.portfolio.savings.SavingsAccountTransactionType; import org.apache.fineract.portfolio.savings.SavingsApiConstants; import org.apache.fineract.portfolio.savings.SavingsCompoundingInterestPeriodType; import org.apache.fineract.portfolio.savings.SavingsInterestCalculationDaysInYearType; @@ -844,6 +845,15 @@ public class SavingsAccount extends AbstractPersistable<Long> { } public SavingsAccountTransaction deposit(final SavingsAccountTransactionDTO transactionDTO) { + return deposit(transactionDTO, SavingsAccountTransactionType.DEPOSIT); + } + + public SavingsAccountTransaction dividendPayout(final SavingsAccountTransactionDTO transactionDTO) { + return deposit(transactionDTO, SavingsAccountTransactionType.DIVIDEND_PAYOUT); + } + + public SavingsAccountTransaction deposit(final SavingsAccountTransactionDTO transactionDTO, + final SavingsAccountTransactionType savingsAccountTransactionType) { final String resourceTypeName = depositAccountType().resourceName(); if (isNotActive()) { final String defaultUserMessage = "Transaction is not allowed. Account is not active."; @@ -886,7 +896,8 @@ public class SavingsAccount extends AbstractPersistable<Long> { final Money amount = Money.of(this.currency, transactionDTO.getTransactionAmount()); final SavingsAccountTransaction transaction = SavingsAccountTransaction.deposit(this, office(), transactionDTO.getPaymentDetail(), - transactionDTO.getTransactionDate(), amount, transactionDTO.getCreatedDate(), transactionDTO.getAppUser()); + transactionDTO.getTransactionDate(), amount, transactionDTO.getCreatedDate(), transactionDTO.getAppUser(), + savingsAccountTransactionType); this.transactions.add(transaction); this.summary.updateSummary(this.currency, this.savingsAccountTransactionSummaryWrapper, this.transactions); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java index c050e7c..56eadcf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainService.java @@ -35,4 +35,6 @@ public interface SavingsAccountDomainService { BigDecimal transactionAmount, PaymentDetail paymentDetail, boolean isAccountTransfer, boolean isRegularTransaction); void postJournalEntries(SavingsAccount savingsAccount, Set<Long> existingTransactionIds, Set<Long> existingReversedTransactionIds); + + SavingsAccountTransaction handleDividendPayout(SavingsAccount account, LocalDate transactionDate, BigDecimal transactionAmount); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java index 3ce2f19..53141c2 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountDomainServiceJpa.java @@ -26,6 +26,7 @@ import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency; import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepositoryWrapper; import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency; import org.apache.fineract.portfolio.paymentdetail.domain.PaymentDetail; +import org.apache.fineract.portfolio.savings.SavingsAccountTransactionType; import org.apache.fineract.portfolio.savings.SavingsTransactionBooleanValues; import org.apache.fineract.portfolio.savings.data.SavingsAccountTransactionDTO; import org.apache.fineract.portfolio.savings.exception.DepositAccountTransactionNotAllowedException; @@ -102,10 +103,12 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi isSavingsInterestPostingAtCurrentPeriodEnd, financialYearBeginningMonth); } List<DepositAccountOnHoldTransaction> depositAccountOnHoldTransactions = null; - if(account.getOnHoldFunds().compareTo(BigDecimal.ZERO) == 1){ - depositAccountOnHoldTransactions = this.depositAccountOnHoldTransactionRepository.findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account); + if (account.getOnHoldFunds().compareTo(BigDecimal.ZERO) == 1) { + depositAccountOnHoldTransactions = this.depositAccountOnHoldTransactionRepository + .findBySavingsAccountAndReversedFalseOrderByCreatedDateAsc(account); } - account.validateAccountBalanceDoesNotBecomeNegative(transactionAmount, transactionBooleanValues.isExceptionForBalanceCheck(), depositAccountOnHoldTransactions); + account.validateAccountBalanceDoesNotBecomeNegative(transactionAmount, transactionBooleanValues.isExceptionForBalanceCheck(), + depositAccountOnHoldTransactions); saveTransactionToGenerateTransactionId(withdrawal); this.savingsAccountRepository.save(account); @@ -127,7 +130,15 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi public SavingsAccountTransaction handleDeposit(final SavingsAccount account, final DateTimeFormatter fmt, final LocalDate transactionDate, final BigDecimal transactionAmount, final PaymentDetail paymentDetail, final boolean isAccountTransfer, final boolean isRegularTransaction) { + final SavingsAccountTransactionType savingsAccountTransactionType = SavingsAccountTransactionType.DEPOSIT; + return handleDeposit(account, fmt, transactionDate, transactionAmount, paymentDetail, isAccountTransfer, isRegularTransaction, + savingsAccountTransactionType); + } + private SavingsAccountTransaction handleDeposit(final SavingsAccount account, final DateTimeFormatter fmt, + final LocalDate transactionDate, final BigDecimal transactionAmount, final PaymentDetail paymentDetail, + final boolean isAccountTransfer, final boolean isRegularTransaction, + final SavingsAccountTransactionType savingsAccountTransactionType) { AppUser user = getAppUserIfPresent(); final boolean isSavingsInterestPostingAtCurrentPeriodEnd = this.configurationDomainService .isSavingsInterestPostingAtCurrentPeriodEnd(); @@ -142,7 +153,7 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi updateExistingTransactionsDetails(account, existingTransactionIds, existingReversedTransactionIds); final SavingsAccountTransactionDTO transactionDTO = new SavingsAccountTransactionDTO(fmt, transactionDate, transactionAmount, paymentDetail, new Date(), user); - final SavingsAccountTransaction deposit = account.deposit(transactionDTO); + final SavingsAccountTransaction deposit = account.deposit(transactionDTO, savingsAccountTransactionType); final MathContext mc = MathContext.DECIMAL64; if (account.isBeforeLastPostingPeriod(transactionDate)) { @@ -163,6 +174,18 @@ public class SavingsAccountDomainServiceJpa implements SavingsAccountDomainServi return deposit; } + @Override + public SavingsAccountTransaction handleDividendPayout(final SavingsAccount account, final LocalDate transactionDate, + final BigDecimal transactionAmount) { + final DateTimeFormatter fmt = null; + final PaymentDetail paymentDetail = null; + final boolean isAccountTransfer = false; + final boolean isRegularTransaction = true; + final SavingsAccountTransactionType savingsAccountTransactionType = SavingsAccountTransactionType.DIVIDEND_PAYOUT; + return handleDeposit(account, fmt, transactionDate, transactionAmount, paymentDetail, isAccountTransfer, isRegularTransaction, + savingsAccountTransactionType); + } + private Long saveTransactionToGenerateTransactionId(final SavingsAccountTransaction transaction) { this.savingsAccountTransactionRepository.save(transaction); return transaction.getId(); http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransaction.java ---------------------------------------------------------------------- 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 a9cfc5d..2e6abcc 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 @@ -135,6 +135,14 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { createdDate, amount, isReversed, appUser); } + public static SavingsAccountTransaction deposit(final SavingsAccount savingsAccount, final Office office, + final PaymentDetail paymentDetail, final LocalDate date, final Money amount, Date createdDate, final AppUser appUser, + final SavingsAccountTransactionType savingsAccountTransactionType) { + final boolean isReversed = false; + return new SavingsAccountTransaction(savingsAccount, office, paymentDetail, savingsAccountTransactionType.getValue(), date, + createdDate, amount, isReversed, appUser); + } + public static SavingsAccountTransaction withdrawal(final SavingsAccount savingsAccount, final Office office, final PaymentDetail paymentDetail, final LocalDate date, final Money amount, Date createdDate, final AppUser appUser) { final boolean isReversed = false; @@ -283,12 +291,20 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { return SavingsAccountTransactionType.fromInt(this.typeOf).isDeposit() && isNotReversed(); } + public boolean isDividendPayout() { + return SavingsAccountTransactionType.fromInt(this.typeOf).isDividendPayout(); + } + + public boolean isDividendPayoutAndNotReversed() { + return SavingsAccountTransactionType.fromInt(this.typeOf).isDividendPayout() && isNotReversed(); + } + public boolean isWithdrawal() { return SavingsAccountTransactionType.fromInt(this.typeOf).isWithdrawal(); } public boolean isPostInterestCalculationRequired() { - return this.isDeposit() || this.isChargeTransaction(); + return this.isDeposit() || this.isChargeTransaction() || this.isDividendPayout(); } public boolean isInterestPostingAndNotReversed() { @@ -470,7 +486,7 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { final MonetaryCurrency currency = openingBalance.getCurrency(); Money endOfDayBalance = openingBalance.copy(); - if (isDeposit()) { + if (isDeposit() || isDividendPayoutAndNotReversed()) { endOfDayBalance = openingBalance.plus(getAmount(currency)); } else if (isWithdrawal() || isChargeTransactionAndNotReversed()) { endOfDayBalance = openingBalance.minus(getAmount(currency)); @@ -486,7 +502,7 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { public EndOfDayBalance toEndOfDayBalance(final Money openingBalance) { final MonetaryCurrency currency = openingBalance.getCurrency(); Money endOfDayBalance = openingBalance.copy(); - if (isDeposit()) { + if (isDeposit() || isDividendPayoutAndNotReversed()) { endOfDayBalance = openingBalance.plus(getAmount(currency)); } else if (isWithdrawal() || isChargeTransactionAndNotReversed()) { @@ -515,7 +531,7 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { final LocalDateInterval spanOfBalance = LocalDateInterval.create(balanceStartDate, balanceEndDate); numberOfDaysOfBalance = spanOfBalance.daysInPeriodInclusiveOfEndDate(); } else { - if (isDeposit()) { + if (isDeposit() || isDividendPayoutAndNotReversed()) { // endOfDayBalance = openingBalance.plus(getAmount(currency)); // if (endOfDayBalance.isLessThanZero()) { endOfDayBalance = endOfDayBalance.plus(getAmount(currency)); @@ -558,7 +574,7 @@ public final class SavingsAccountTransaction extends AbstractPersistable<Long> { } public boolean isCredit() { - return isDeposit() || isInterestPostingAndNotReversed(); + return isDeposit() || isInterestPostingAndNotReversed() || isDividendPayoutAndNotReversed(); } public boolean isDebit() { http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/domain/SavingsAccountTransactionSummaryWrapper.java ---------------------------------------------------------------------- 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 744180d..6f7ffe6 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 @@ -35,7 +35,7 @@ public final class SavingsAccountTransactionSummaryWrapper { public BigDecimal calculateTotalDeposits(final MonetaryCurrency currency, final List<SavingsAccountTransaction> transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { - if (transaction.isDeposit() && transaction.isNotReversed()) { + if (transaction.isDepositAndNotReversed() || transaction.isDividendPayoutAndNotReversed()) { total = total.plus(transaction.getAmount(currency)); } } @@ -131,7 +131,6 @@ public final class SavingsAccountTransactionSummaryWrapper { } return total.getAmountDefaultedToNullIfZero(); } - public BigDecimal calculateTotalWithholdTaxWithdrawal(MonetaryCurrency currency, List<SavingsAccountTransaction> transactions) { Money total = Money.zero(currency); for (final SavingsAccountTransaction transaction : transactions) { @@ -141,5 +140,4 @@ public final class SavingsAccountTransactionSummaryWrapper { } return total.getAmountDefaultedToNullIfZero(); } - } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java index e2fa675..59f7f19 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountChargeReadPlatformServiceImpl.java @@ -74,12 +74,18 @@ public class SavingsAccountChargeReadPlatformServiceImpl implements SavingsAccou private static final class SavingsAccountChargeMapper implements RowMapper<SavingsAccountChargeData> { public String schema() { - return "sc.id as id, c.id as chargeId, sc.savings_account_id as accountId, c.name as name, " + "sc.amount as amountDue, " - + "sc.amount_paid_derived as amountPaid, " + "sc.amount_waived_derived as amountWaived, " - + "sc.amount_writtenoff_derived as amountWrittenOff, " + "sc.amount_outstanding_derived as amountOutstanding, " + return "sc.id as id, c.id as chargeId, sc.savings_account_id as accountId, c.name as name, " + + "sc.amount as amountDue, " + + "sc.amount_paid_derived as amountPaid, " + + "sc.amount_waived_derived as amountWaived, " + + "sc.amount_writtenoff_derived as amountWrittenOff, " + + "sc.amount_outstanding_derived as amountOutstanding, " + "sc.calculation_percentage as percentageOf, sc.calculation_on_amount as amountPercentageAppliedTo, " - + "sc.charge_time_enum as chargeTime, " + "sc.is_penalty as penalty, " + "sc.charge_due_date as dueAsOfDate, " - + "sc.fee_on_month as feeOnMonth, " + "sc.fee_on_day as feeOnDay, sc.fee_interval as feeInterval, " + + "sc.charge_time_enum as chargeTime, " + + "sc.is_penalty as penalty, " + + "sc.charge_due_date as dueAsOfDate, " + + "sc.fee_on_month as feeOnMonth, " + + "sc.fee_on_day as feeOnDay, sc.fee_interval as feeInterval, " + "sc.charge_calculation_enum as chargeCalculation, " + "sc.is_active as isActive, sc.inactivated_on_date as inactivationDate, " + "c.currency_code as currencyCode, oc.name as currencyName, " @@ -160,14 +166,14 @@ public class SavingsAccountChargeReadPlatformServiceImpl implements SavingsAccou final List<EnumOptionData> feeFrequencyOptions = this.dropdownReadPlatformService.retrievePeriodFrequencyTypeOptions(); // this field is applicable only for client charges final Map<String, List<GLAccountData>> incomeOrLiabilityAccountOptions = null; - + final List<EnumOptionData> shareChargeCalculationTypeOptions = null; + final List<EnumOptionData> shareChargeTimeTypeOptions = null; final Collection<TaxGroupData> taxGroupOptions = null; - // TODO AA : revisit for merge conflict - Not sure method signature return ChargeData.template(null, allowedChargeCalculationTypeOptions, null, allowedChargeTimeOptions, null, loansChargeCalculationTypeOptions, loansChargeTimeTypeOptions, savingsChargeCalculationTypeOptions, savingsChargeTimeTypeOptions, clientChargeCalculationTypeOptions, clientChargeTimeTypeOptions, feeFrequencyOptions, - incomeOrLiabilityAccountOptions, taxGroupOptions); + incomeOrLiabilityAccountOptions, taxGroupOptions, shareChargeCalculationTypeOptions, shareChargeTimeTypeOptions); } @Override @@ -244,7 +250,8 @@ public class SavingsAccountChargeReadPlatformServiceImpl implements SavingsAccou @Override public Collection<SavingsAccountAnnualFeeData> retrieveChargesWithDue() { - final String sql = "select " + this.chargeDueMapper.schema() + final String sql = "select " + + this.chargeDueMapper.schema() + " where sac.charge_due_date is not null and sac.charge_due_date <= NOW() and sac.waived = 0 and sac.is_paid_derived=0 and sac.is_active=1 and sa.status_enum = " + SavingsAccountStatusType.ACTIVE.getValue() + " order by sac.charge_due_date "; http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java index c295561..270562e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsEnumerations.java @@ -183,6 +183,10 @@ public class SavingsEnumerations { optionData = new SavingsAccountTransactionEnumData(SavingsAccountTransactionType.WITHHOLD_TAX.getValue().longValue(), SavingsAccountTransactionType.WITHHOLD_TAX.getCode(), "Withhold Tax"); break; + case DIVIDEND_PAYOUT: + optionData = new SavingsAccountTransactionEnumData(SavingsAccountTransactionType.DIVIDEND_PAYOUT.getValue().longValue(), + SavingsAccountTransactionType.DIVIDEND_PAYOUT.getCode(), "Dividend Payout"); + break; } return optionData; } http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java new file mode 100644 index 0000000..95048c6 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/PurchasedSharesData.java @@ -0,0 +1,78 @@ +/** + * 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.shareaccounts.data; + +import java.math.BigDecimal; + +import org.apache.fineract.infrastructure.core.data.EnumOptionData; +import org.joda.time.LocalDate; + +public class PurchasedSharesData { + + private final Long id; + + private final Long accountId; + + private final LocalDate purchasedDate; + + private final Long numberOfShares; + + private final BigDecimal purchasedPrice; + + private final EnumOptionData status; + + private final EnumOptionData type; + + private final BigDecimal amount ; + + private final BigDecimal chargeAmount ; + + public PurchasedSharesData(final Long id, final Long accountId, final LocalDate purchasedDate, final Long numberOfShares, + final BigDecimal purchasedPrice, final EnumOptionData status, final EnumOptionData type, final BigDecimal amount, final BigDecimal chargeAmount) { + this.id = id; + this.accountId = accountId; + this.purchasedDate = purchasedDate; + this.numberOfShares = numberOfShares; + this.purchasedPrice = purchasedPrice; + this.status = status; + this.type = type; + this.amount = amount ; + this.chargeAmount = chargeAmount ; + } + + public LocalDate getPurchasedDate() { + return this.purchasedDate; + } + + public Long getNumberOfShares() { + return this.numberOfShares; + } + + public BigDecimal getPurchasedPrice() { + return this.purchasedPrice; + } + + public EnumOptionData getStatus() { + return this.status; + } + + public EnumOptionData getType() { + return this.type; + } +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java new file mode 100644 index 0000000..73ef751 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountApplicationTimelineData.java @@ -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. + */ +package org.apache.fineract.portfolio.shareaccounts.data; + +import org.joda.time.LocalDate; + +@SuppressWarnings("unused") +public class ShareAccountApplicationTimelineData { + + private final LocalDate submittedOnDate; + private final String submittedByUsername; + private final String submittedByFirstname; + private final String submittedByLastname; + + private final LocalDate rejectedDate; + private final String rejectedByUsername; + private final String rejectedByFirstname; + private final String rejectedByLastname; + + private final LocalDate approvedDate; + private final String approvedByUsername; + private final String approvedByFirstname; + private final String approvedByLastname; + + private final LocalDate activatedDate; + private final String activatedByUsername; + private final String activatedByFirstname; + private final String activatedByLastname; + + private final LocalDate closedDate; + private final String closedByUsername; + private final String closedByFirstname; + private final String closedByLastname; + + public static ShareAccountApplicationTimelineData templateDefault() { + + final LocalDate submittedOnDate = null; + final String submittedByUsername = null; + final String submittedByFirstname = null; + final String submittedByLastname = null; + final LocalDate rejectedOnDate = null; + final String rejectedByUsername = null; + final String rejectedByFirstname = null; + final String rejectedByLastname = null; + final LocalDate approvedOnDate = null; + final String approvedByUsername = null; + final String approvedByFirstname = null; + final String approvedByLastname = null; + final LocalDate activatedOnDate = null; + final String activatedByUsername = null; + final String activatedByFirstname = null; + final String activatedByLastname = null; + final LocalDate closedOnDate = null; + final String closedByUsername = null; + final String closedByFirstname = null; + final String closedByLastname = null; + + return new ShareAccountApplicationTimelineData(submittedOnDate, submittedByUsername, submittedByFirstname, submittedByLastname, + rejectedOnDate, rejectedByUsername, rejectedByFirstname, rejectedByLastname, approvedOnDate, approvedByUsername, + approvedByFirstname, approvedByLastname, activatedOnDate, activatedByUsername, activatedByFirstname, activatedByLastname, + closedOnDate, closedByUsername, closedByFirstname, closedByLastname); + } + + public ShareAccountApplicationTimelineData(final LocalDate submittedOnDate, final String submittedByUsername, + final String submittedByFirstname, final String submittedByLastname, final LocalDate rejectedOnDate, + final String rejectedByUsername, final String rejectedByFirstname, final String rejectedByLastname, + final LocalDate approvedOnDate, final String approvedByUsername, + final String approvedByFirstname, final String approvedByLastname, final LocalDate activatedOnDate, + final String activatedByUsername, final String activatedByFirstname, final String activatedByLastname, + final LocalDate closedOnDate, final String closedByUsername, final String closedByFirstname, final String closedByLastname) { + this.submittedOnDate = submittedOnDate; + this.submittedByUsername = submittedByUsername; + this.submittedByFirstname = submittedByFirstname; + this.submittedByLastname = submittedByLastname; + this.rejectedDate = rejectedOnDate; + this.rejectedByUsername = rejectedByUsername; + this.rejectedByFirstname = rejectedByFirstname; + this.rejectedByLastname = rejectedByLastname; + this.approvedDate = approvedOnDate; + this.approvedByUsername = approvedByUsername; + this.approvedByFirstname = approvedByFirstname; + this.approvedByLastname = approvedByLastname; + this.activatedDate = activatedOnDate; + this.activatedByUsername = activatedByUsername; + this.activatedByFirstname = activatedByFirstname; + this.activatedByLastname = activatedByLastname; + this.closedDate = closedOnDate; + this.closedByUsername = closedByUsername; + this.closedByFirstname = closedByFirstname; + this.closedByLastname = closedByLastname; + } +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/08c553f9/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java new file mode 100644 index 0000000..497db0e --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/shareaccounts/data/ShareAccountChargeData.java @@ -0,0 +1,95 @@ +/** + * 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.shareaccounts.data; + +import java.math.BigDecimal; +import java.util.Collection; + +import org.apache.fineract.infrastructure.core.data.EnumOptionData; +import org.apache.fineract.organisation.monetary.data.CurrencyData; +import org.apache.fineract.portfolio.charge.data.ChargeData; +import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType; +import org.joda.time.LocalDate; +import org.joda.time.MonthDay; + +@SuppressWarnings("unused") +public class ShareAccountChargeData { + + private final Long id; + + private final Long chargeId; + + private final Long accountId; + + private final String name; + + private final EnumOptionData chargeTimeType; + + private final EnumOptionData chargeCalculationType; + + private final BigDecimal percentage; + + private final BigDecimal amountPercentageAppliedTo; + + private final CurrencyData currency; + + private final BigDecimal amount; + + private final BigDecimal amountPaid; + + private final BigDecimal amountWaived; + + private final BigDecimal amountWrittenOff; + + private final BigDecimal amountOutstanding; + + private final BigDecimal amountOrPercentage; + + private final Boolean isActive; + + private final Collection<ChargeData> chargeOptions; + + public ShareAccountChargeData(final Long id, final Long chargeId, final Long accountId, final String name, + final CurrencyData currency, final BigDecimal amount, final BigDecimal amountPaid, final BigDecimal amountWaived, + final BigDecimal amountWrittenOff, final BigDecimal amountOutstanding, final EnumOptionData chargeTimeType, + final EnumOptionData chargeCalculationType, final BigDecimal percentage, final BigDecimal amountPercentageAppliedTo, + final Collection<ChargeData> chargeOptions, final Boolean isActive) { + this.id = id; + this.chargeId = chargeId; + this.accountId = accountId; + this.name = name; + this.chargeTimeType = chargeTimeType; + this.chargeCalculationType = chargeCalculationType; + this.percentage = percentage; + this.amountPercentageAppliedTo = amountPercentageAppliedTo; + this.currency = currency; + this.amount = amount; + this.amountPaid = amountPaid; + this.amountWaived = amountWaived; + this.amountWrittenOff = amountWrittenOff; + this.amountOutstanding = amountOutstanding; + this.amountOrPercentage = getAmountOrPercentage(); + this.chargeOptions = chargeOptions; + this.isActive = isActive; + } + + private BigDecimal getAmountOrPercentage() { + return (this.chargeCalculationType != null) && (this.chargeCalculationType.getId().intValue() > 1) ? this.percentage : this.amount; + } +}