try {
this.context.authenticatedUser();
this.fromApiJsonDataValidator.validateForRecurringDepositUpdate(command.json());
final RecurringDepositProduct product = this.recurringDepositProductRepository.findOne(productId);
if (product == null) { throw new RecurringDepositProductNotFoundException(productId); }
product.setHelpers(this.chartAssembler);
final Map<String, Object> changes = product.update(command);
if (changes.containsKey(chargesParamName)) {
final Set<Charge> savingsProductCharges = this.depositProductAssembler.assembleListOfSavingsProductCharges(command, product
.currency().getCode());
final boolean updated = product.update(savingsProductCharges);
if (!updated) {
changes.remove(chargesParamName);
}
}
// accounting related changes
final boolean accountingTypeChanged = changes.containsKey(accountingRuleParamName);
final Map<String, Object> accountingMappingChanges = this.accountMappingWritePlatformService
.updateSavingsProductToGLAccountMapping(product.getId(), command, accountingTypeChanged, product.getAccountingType(),
DepositAccountType.RECURRING_DEPOSIT);
changes.putAll(accountingMappingChanges);
if (!changes.isEmpty()) {
this.recurringDepositProductRepository.save(product);
}
return new CommandProcessingResultBuilder() //
.withEntityId(product.getId()) //
.with(changes).build();
} catch (final DataAccessException e) {
handleDataIntegrityIssues(command, e);
return CommandProcessingResult.empty();
}