blob: fa7bc44c100e2d49f48498d629b02fae509b9bb1 [file] [log] [blame]
/**
* 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.shareproducts.serialization;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.fineract.accounting.common.AccountingConstants;
import org.apache.fineract.accounting.common.AccountingRuleType;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.ApiParameterError;
import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
import org.apache.fineract.infrastructure.core.exception.InvalidJsonException;
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.organisation.monetary.exception.InvalidCurrencyException;
import org.apache.fineract.portfolio.charge.domain.Charge;
import org.apache.fineract.portfolio.charge.domain.ChargeRepositoryWrapper;
import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
import org.apache.fineract.portfolio.shareproducts.constants.ShareProductApiConstants;
import org.apache.fineract.portfolio.shareproducts.data.ShareProductMarketPriceData;
import org.apache.fineract.portfolio.shareproducts.domain.ShareProduct;
import org.apache.fineract.portfolio.shareproducts.domain.ShareProductMarketPrice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ShareProductDataSerializer {
private static final Set<String> supportedParametersForCreate = new HashSet<>(Arrays.asList(ShareProductApiConstants.locale_paramname,
ShareProductApiConstants.name_paramname, ShareProductApiConstants.shortname_paramname,
ShareProductApiConstants.shortname_paramname, ShareProductApiConstants.description_paramname,
ShareProductApiConstants.externalid_paramname, ShareProductApiConstants.totalshares_paramname,
ShareProductApiConstants.currency_paramname, ShareProductApiConstants.digitsafterdecimal_paramname,
ShareProductApiConstants.digitsafterdecimal_paramname, ShareProductApiConstants.inmultiplesof_paramname,
ShareProductApiConstants.totalsharesissued_paramname, ShareProductApiConstants.unitprice_paramname,
ShareProductApiConstants.minimumshares_paramname, ShareProductApiConstants.nominaltshares_paramname,
ShareProductApiConstants.maximumshares_paramname, ShareProductApiConstants.marketprice_paramname,
ShareProductApiConstants.charges_paramname, ShareProductApiConstants.allowdividendcalculationforinactiveclients_paramname,
ShareProductApiConstants.lockperiod_paramname, ShareProductApiConstants.lockinperiodfrequencytype_paramname,
ShareProductApiConstants.minimumactiveperiodfordividends_paramname,
ShareProductApiConstants.minimumactiveperiodfrequencytype_paramname, ShareProductApiConstants.sharecapital_paramname,
ShareProductApiConstants.accountingRuleParamName, AccountingConstants.SharesProductAccountingParams.INCOME_FROM_FEES.getValue(),
AccountingConstants.SharesProductAccountingParams.SHARES_EQUITY.getValue(),
AccountingConstants.SharesProductAccountingParams.SHARES_REFERENCE.getValue(),
AccountingConstants.SharesProductAccountingParams.SHARES_SUSPENSE.getValue()));
private static final Set<String> supportedParametersForDivident = new HashSet<>(Arrays.asList(ShareProductApiConstants.locale_paramname,
ShareProductApiConstants.dateFormatParamName, ShareProductApiConstants.dividendPeriodStartDateParamName,
ShareProductApiConstants.dividendPeriodEndDateParamName, ShareProductApiConstants.dividendAmountParamName));
private final FromJsonHelper fromApiJsonHelper;
private final ChargeRepositoryWrapper chargeRepository;
private final PlatformSecurityContext platformSecurityContext;
@Autowired
public ShareProductDataSerializer(final FromJsonHelper fromApiJsonHelper, final ChargeRepositoryWrapper chargeRepository,
final PlatformSecurityContext platformSecurityContext) {
this.fromApiJsonHelper = fromApiJsonHelper;
this.chargeRepository = chargeRepository;
this.platformSecurityContext = platformSecurityContext;
}
public ShareProduct validateAndCreate(JsonCommand jsonCommand) {
if (StringUtils.isBlank(jsonCommand.json())) {
throw new InvalidJsonException();
}
final Type typeOfMap = new TypeToken<Map<String, Object>>() {
}.getType();
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, jsonCommand.json(), supportedParametersForCreate);
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("sharesproduct");
JsonElement element = jsonCommand.parsedJson();
final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(element.getAsJsonObject());
final String productName = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.name_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.name_paramname).value(productName).notBlank()
.notExceedingLengthOf(200);
final String shortName = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.shortname_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.shortname_paramname).value(shortName).notBlank()
.notExceedingLengthOf(4);
final String description = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.description_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.description_paramname).value(description).notBlank()
.notExceedingLengthOf(500);
String externalId = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.externalid_paramname, element);
// baseDataValidator.reset().parameter(ShareProductApiConstants.externalid_paramname).value(externalId).notBlank();
Long totalNumberOfShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.totalshares_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.totalshares_paramname).value(totalNumberOfShares).notNull()
.longGreaterThanZero();
final Long sharesIssued = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.totalsharesissued_paramname, element);
if (sharesIssued != null && totalNumberOfShares != null && sharesIssued > totalNumberOfShares) {
baseDataValidator.reset().parameter(ShareProductApiConstants.totalsharesissued_paramname).value(sharesIssued)
.failWithCodeNoParameterAddedToErrorCode("sharesIssued.cannot.be.greater.than.totalNumberOfShares");
}
final String currencyCode = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.currency_paramname, element);
final Integer digitsAfterDecimal = this.fromApiJsonHelper
.extractIntegerWithLocaleNamed(ShareProductApiConstants.digitsafterdecimal_paramname, element);
final Integer inMultiplesOf = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(ShareProductApiConstants.inmultiplesof_paramname,
element);
final MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal, inMultiplesOf);
final BigDecimal unitPrice = this.fromApiJsonHelper.extractBigDecimalNamed(ShareProductApiConstants.unitprice_paramname, element,
locale);
baseDataValidator.reset().parameter(ShareProductApiConstants.unitprice_paramname).value(unitPrice).notNull().positiveAmount();
BigDecimal shareCapitalValue = BigDecimal.ONE;
if (sharesIssued != null && unitPrice != null) {
shareCapitalValue = BigDecimal.valueOf(sharesIssued).multiply(unitPrice);
}
Integer accountingRule = this.fromApiJsonHelper.extractIntegerNamed(ShareProductApiConstants.accountingRuleParamName, element,
locale);
baseDataValidator.reset().parameter(ShareProductApiConstants.accountingRuleParamName).value(accountingRule).notNull()
.integerGreaterThanZero();
AccountingRuleType accountingRuleType = null;
if (accountingRule != null) {
accountingRuleType = AccountingRuleType.fromInt(accountingRule);
}
Long minimumClientShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.minimumshares_paramname, element);
Long nominalClientShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.nominaltshares_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.nominaltshares_paramname).value(nominalClientShares).notNull()
.longGreaterThanZero();
if (minimumClientShares != null && nominalClientShares != null && !minimumClientShares.equals(nominalClientShares)) {
baseDataValidator.reset().parameter(ShareProductApiConstants.nominaltshares_paramname).value(nominalClientShares)
.longGreaterThanNumber(minimumClientShares);
}
Long maximumClientShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.maximumshares_paramname, element);
if (maximumClientShares != null && nominalClientShares != null && !maximumClientShares.equals(nominalClientShares)) {
baseDataValidator.reset().parameter(ShareProductApiConstants.maximumshares_paramname).value(maximumClientShares)
.longGreaterThanNumber(nominalClientShares);
}
Set<ShareProductMarketPrice> marketPriceSet = asembleShareMarketPrice(element);
Set<Charge> charges = assembleListOfProductCharges(element, currencyCode);
Boolean allowdividendsForInactiveClients = this.fromApiJsonHelper
.extractBooleanNamed(ShareProductApiConstants.allowdividendcalculationforinactiveclients_paramname, element);
Integer minimumActivePeriod = this.fromApiJsonHelper
.extractIntegerNamed(ShareProductApiConstants.minimumactiveperiodfordividends_paramname, element, locale);
PeriodFrequencyType minimumActivePeriodType = extractPeriodType(ShareProductApiConstants.minimumactiveperiodfrequencytype_paramname,
element);
if (minimumActivePeriod != null) {
baseDataValidator.reset().parameter(ShareProductApiConstants.minimumactiveperiodfrequencytype_paramname)
.value(minimumActivePeriodType.getValue()).integerSameAsNumber(PeriodFrequencyType.DAYS.getValue());
}
Integer lockinPeriod = this.fromApiJsonHelper.extractIntegerNamed(ShareProductApiConstants.lockperiod_paramname, element, locale);
PeriodFrequencyType lockPeriodType = extractPeriodType(ShareProductApiConstants.lockinperiodfrequencytype_paramname, element);
ShareProduct product = new ShareProduct(productName, shortName, description, externalId, currency, totalNumberOfShares,
sharesIssued, unitPrice, shareCapitalValue, minimumClientShares, nominalClientShares, maximumClientShares, marketPriceSet,
charges, allowdividendsForInactiveClients, lockinPeriod, lockPeriodType, minimumActivePeriod, minimumActivePeriodType,
accountingRuleType);
for (ShareProductMarketPrice data : marketPriceSet) {
data.setShareProduct(product);
}
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException(dataValidationErrors);
}
return product;
}
private PeriodFrequencyType extractPeriodType(String paramName, final JsonElement element) {
PeriodFrequencyType frequencyType = PeriodFrequencyType.INVALID;
frequencyType = PeriodFrequencyType.fromInt(this.fromApiJsonHelper.extractIntegerWithLocaleNamed(paramName, element));
return frequencyType;
}
private Set<ShareProductMarketPriceData> asembleShareMarketPriceForUpdate(final JsonElement element) {
Set<ShareProductMarketPriceData> set = null;
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.marketprice_paramname, element)) {
set = new HashSet<>();
JsonArray array = this.fromApiJsonHelper.extractJsonArrayNamed(ShareProductApiConstants.marketprice_paramname, element);
for (JsonElement arrayElement : array) {
Long id = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.id_paramname, arrayElement);
LocalDate localDate = this.fromApiJsonHelper.extractLocalDateNamed(ShareProductApiConstants.startdate_paramname,
arrayElement);
final BigDecimal shareValue = this.fromApiJsonHelper
.extractBigDecimalWithLocaleNamed(ShareProductApiConstants.sharevalue_paramname, arrayElement);
ShareProductMarketPriceData obj = new ShareProductMarketPriceData(id, localDate, shareValue);
set.add(obj);
}
}
return set;
}
private Set<ShareProductMarketPrice> asembleShareMarketPrice(final JsonElement element) {
Set<ShareProductMarketPrice> set = new HashSet<>();
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.marketprice_paramname, element)) {
set = new HashSet<>();
JsonArray array = this.fromApiJsonHelper.extractJsonArrayNamed(ShareProductApiConstants.marketprice_paramname, element);
for (JsonElement arrayElement : array) {
LocalDate localDate = this.fromApiJsonHelper.extractLocalDateNamed(ShareProductApiConstants.startdate_paramname,
arrayElement);
final BigDecimal shareValue = this.fromApiJsonHelper
.extractBigDecimalWithLocaleNamed(ShareProductApiConstants.sharevalue_paramname, arrayElement);
ShareProductMarketPrice obj = new ShareProductMarketPrice(localDate, shareValue);
set.add(obj);
}
}
return set;
}
private Set<Charge> assembleListOfProductCharges(final JsonElement element, final String currencyCode) {
final Set<Charge> charges = new HashSet<>();
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.charges_paramname, element)) {
JsonArray chargesArray = this.fromApiJsonHelper.extractJsonArrayNamed(ShareProductApiConstants.charges_paramname, element);
if (chargesArray != null) {
for (int i = 0; i < chargesArray.size(); i++) {
final JsonObject jsonObject = chargesArray.get(i).getAsJsonObject();
if (jsonObject.has("id")) {
final Long id = jsonObject.get("id").getAsLong();
final Charge charge = this.chargeRepository.findOneWithNotFoundDetection(id);
if (!currencyCode.equals(charge.getCurrencyCode())) {
final String errorMessage = "Charge and Share Product must have the same currency.";
throw new InvalidCurrencyException("charge", "attach.to.share.product", errorMessage);
}
charges.add(charge);
}
}
}
}
return charges;
}
public Map<String, Object> validateAndUpdate(JsonCommand jsonCommand, ShareProduct product) {
Map<String, Object> actualChanges = new HashMap<>();
if (StringUtils.isBlank(jsonCommand.json())) {
throw new InvalidJsonException();
}
final Type typeOfMap = new TypeToken<Map<String, Object>>() {
}.getType();
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, jsonCommand.json(), supportedParametersForCreate);
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("sharesproduct");
JsonElement element = jsonCommand.parsedJson();
final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(element.getAsJsonObject());
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.name_paramname, element)) {
final String productName = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.name_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.name_paramname).value(productName).notBlank();
if (product.setProductName(productName)) {
actualChanges.put(ShareProductApiConstants.name_paramname, productName);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.shortname_paramname, element)) {
final String shortName = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.shortname_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.shortname_paramname).value(shortName).notBlank();
if (product.setShortName(shortName)) {
actualChanges.put(ShareProductApiConstants.shortname_paramname, shortName);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.description_paramname, element)) {
String description = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.description_paramname, element);
if (product.setDescription(description)) {
actualChanges.put(ShareProductApiConstants.description_paramname, description);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.externalid_paramname, element)) {
String externalId = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.externalid_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.externalid_paramname).value(externalId).notBlank();
if (product.setExternalId(externalId)) {
actualChanges.put(ShareProductApiConstants.externalid_paramname, externalId);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.totalshares_paramname, element)) {
Long totalShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.totalshares_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.totalshares_paramname).value(totalShares).notNull()
.longGreaterThanZero();
if (product.setTotalShares(totalShares)) {
actualChanges.put(ShareProductApiConstants.totalshares_paramname, totalShares);
}
}
Long sharesIssued = null;
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.totalsharesissued_paramname, element)) {
sharesIssued = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.totalsharesissued_paramname, element);
if (product.setTotalIssuedShares(sharesIssued)) {
actualChanges.put(ShareProductApiConstants.totalsharesissued_paramname, sharesIssued);
}
} else {
product.setTotalIssuedShares(sharesIssued);
}
if (sharesIssued != null && product.getSubscribedShares() != null && sharesIssued < product.getSubscribedShares()) {
baseDataValidator.reset().parameter(ShareProductApiConstants.totalsharesissued_paramname).value(sharesIssued)
.failWithCodeNoParameterAddedToErrorCode("sharesissued.can.not.be.lessthan.accounts.subscribed.shares");
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.currency_paramname, element)
&& this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.digitsafterdecimal_paramname, element)
&& this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.inmultiplesof_paramname, element)) {
final String currencyCode = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.currency_paramname, element);
final Integer digitsAfterDecimal = this.fromApiJsonHelper
.extractIntegerWithLocaleNamed(ShareProductApiConstants.digitsafterdecimal_paramname, element);
final Integer inMultiplesOf = this.fromApiJsonHelper
.extractIntegerWithLocaleNamed(ShareProductApiConstants.inmultiplesof_paramname, element);
final MonetaryCurrency currency = new MonetaryCurrency(currencyCode, digitsAfterDecimal, inMultiplesOf);
if (product.setMonetaryCurrency(currency)) {
actualChanges.put(ShareProductApiConstants.currency_paramname, currency);
}
}
BigDecimal unitPrice = null;
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.unitprice_paramname, element)) {
unitPrice = this.fromApiJsonHelper.extractBigDecimalNamed(ShareProductApiConstants.unitprice_paramname, element, locale);
baseDataValidator.reset().parameter(ShareProductApiConstants.unitprice_paramname).value(unitPrice).notNull().positiveAmount();
if (product.setUnitPrice(unitPrice)) {
actualChanges.put(ShareProductApiConstants.unitprice_paramname, unitPrice);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.accountingRuleParamName, element)) {
Integer accountingRule = this.fromApiJsonHelper.extractIntegerWithLocaleNamed(ShareProductApiConstants.accountingRuleParamName,
element);
baseDataValidator.reset().parameter(ShareProductApiConstants.accountingRuleParamName).value(accountingRule).notNull()
.integerGreaterThanZero();
if (product.setAccountingRule(accountingRule)) {
actualChanges.put(ShareProductApiConstants.accountingRuleParamName, accountingRule);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.minimumshares_paramname, element)) {
Long minimumClientShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.minimumshares_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.minimumshares_paramname).value(minimumClientShares).notNull()
.longGreaterThanZero();
if (product.setMinimumShares(minimumClientShares)) {
actualChanges.put(ShareProductApiConstants.minimumshares_paramname, minimumClientShares);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.nominaltshares_paramname, element)) {
Long nominalClientShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.nominaltshares_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.nominaltshares_paramname).value(nominalClientShares).notNull()
.longGreaterThanZero();
if (product.setNominalShares(nominalClientShares)) {
actualChanges.put(ShareProductApiConstants.nominaltshares_paramname, nominalClientShares);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.maximumshares_paramname, element)) {
Long maximumClientShares = this.fromApiJsonHelper.extractLongNamed(ShareProductApiConstants.maximumshares_paramname, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.maximumshares_paramname).value(maximumClientShares).notNull()
.longGreaterThanZero();
if (product.setMaximumShares(maximumClientShares)) {
actualChanges.put(ShareProductApiConstants.maximumshares_paramname, maximumClientShares);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.marketprice_paramname, element)) {
Set<ShareProductMarketPriceData> marketPrice = asembleShareMarketPriceForUpdate(element);
if (product.setMarketPrice(marketPrice)) {
actualChanges.put(ShareProductApiConstants.marketprice_paramname, marketPrice);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.charges_paramname, element)) {
final String currencyCode = this.fromApiJsonHelper.extractStringNamed(ShareProductApiConstants.currency_paramname, element);
Set<Charge> charges = assembleListOfProductCharges(element, currencyCode);
if (product.setCharges(charges)) {
actualChanges.put(ShareProductApiConstants.charges_paramname, charges);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.allowdividendcalculationforinactiveclients_paramname,
element)) {
Boolean allowdividendsForInactiveClients = this.fromApiJsonHelper
.extractBooleanNamed(ShareProductApiConstants.allowdividendcalculationforinactiveclients_paramname, element);
if (product.setAllowDividendCalculationForInactiveClients(allowdividendsForInactiveClients)) {
actualChanges.put(ShareProductApiConstants.allowdividendcalculationforinactiveclients_paramname,
allowdividendsForInactiveClients);
}
}
Integer minimumActivePeriod = null;
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.minimumactiveperiodfordividends_paramname, element)) {
minimumActivePeriod = this.fromApiJsonHelper
.extractIntegerNamed(ShareProductApiConstants.minimumactiveperiodfordividends_paramname, element, locale);
if (product.setminimumActivePeriod(minimumActivePeriod)) {
actualChanges.put(ShareProductApiConstants.minimumactiveperiodfordividends_paramname, minimumActivePeriod);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.minimumactiveperiodfrequencytype_paramname, element)) {
PeriodFrequencyType minimumActivePeriodType = extractPeriodType(
ShareProductApiConstants.minimumactiveperiodfrequencytype_paramname, element);
if (minimumActivePeriod != null) {
baseDataValidator.reset().parameter(ShareProductApiConstants.minimumactiveperiodfrequencytype_paramname)
.value(minimumActivePeriodType.getValue()).integerSameAsNumber(PeriodFrequencyType.DAYS.getValue());
}
if (product.setminimumActivePeriodFrequencyType(minimumActivePeriodType)) {
actualChanges.put(ShareProductApiConstants.minimumactiveperiodfrequencytype_paramname, minimumActivePeriodType);
}
}
final Integer lockinPeriod;
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.lockperiod_paramname, element)) {
lockinPeriod = this.fromApiJsonHelper.extractIntegerNamed(ShareProductApiConstants.lockperiod_paramname, element, locale);
if (product.setLockinPeriod(lockinPeriod)) {
actualChanges.put(ShareProductApiConstants.lockperiod_paramname, lockinPeriod);
}
}
if (this.fromApiJsonHelper.parameterExists(ShareProductApiConstants.lockinperiodfrequencytype_paramname, element)) {
PeriodFrequencyType lockPeriod = extractPeriodType(ShareProductApiConstants.lockinperiodfrequencytype_paramname, element);
if (product.setLockPeriodFrequencyType(lockPeriod)) {
actualChanges.put(ShareProductApiConstants.lockinperiodfrequencytype_paramname, lockPeriod);
}
}
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException(dataValidationErrors);
}
BigDecimal shareCapitalValue;
if (sharesIssued != null || unitPrice != null) {
if (sharesIssued == null) {
sharesIssued = product.getTotalShares();
}
if (unitPrice == null) {
unitPrice = product.getUnitPrice();
}
shareCapitalValue = BigDecimal.valueOf(sharesIssued).multiply(unitPrice);
if (product.setshareCapitalValue(shareCapitalValue)) {
actualChanges.put(ShareProductApiConstants.sharecapital_paramname, shareCapitalValue);
}
}
return actualChanges;
}
public void validateDividendDetails(JsonCommand jsonCommand) {
if (StringUtils.isBlank(jsonCommand.json())) {
throw new InvalidJsonException();
}
final Type typeOfMap = new TypeToken<Map<String, Object>>() {
}.getType();
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, jsonCommand.json(), supportedParametersForDivident);
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors)
.resource("sharesproduct.dividend.processing");
JsonElement element = jsonCommand.parsedJson();
final LocalDate dividendPeriodStartDate = this.fromApiJsonHelper
.extractLocalDateNamed(ShareProductApiConstants.dividendPeriodStartDateParamName, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.dividendPeriodStartDateParamName).value(dividendPeriodStartDate)
.notBlank();
final LocalDate dividendPeriodEndDate = this.fromApiJsonHelper
.extractLocalDateNamed(ShareProductApiConstants.dividendPeriodEndDateParamName, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.dividendPeriodStartDateParamName).value(dividendPeriodEndDate)
.notBlank().validateDateAfter(dividendPeriodStartDate);
final BigDecimal dividendAmount = this.fromApiJsonHelper
.extractBigDecimalWithLocaleNamed(ShareProductApiConstants.dividendAmountParamName, element);
baseDataValidator.reset().parameter(ShareProductApiConstants.dividendAmountParamName).value(dividendAmount).notBlank()
.positiveAmount();
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException(dataValidationErrors);
}
}
}