MinimumBalance,MaximunBalance fields added for saving product

This commit is contained in:
madhukar
2012-08-08 18:35:53 +05:30
parent eff8838f5b
commit c306781a46
12 changed files with 165 additions and 17 deletions
@@ -252,4 +252,16 @@ public class DataValidatorBuilder {
dataValidationErrors.add(error); dataValidationErrors.add(error);
return this; return this;
} }
public DataValidatorBuilder comapareMinimumAndMaximumAmounts(BigDecimal minimumBalance,BigDecimal maximumBalance){
if(minimumBalance!=null&&maximumBalance!=null)
if(maximumBalance.compareTo(minimumBalance)==-1){
StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(resource).append(".minimum.amount.should.lessthan.maximun.amount");
StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(" minimum amount ").append(minimumBalance).append(" should less than maximum amount ").append(maximumBalance).append(".");
ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), parameter, minimumBalance, maximumBalance);
dataValidationErrors.add(error);
return this;
}
return this;
}
} }
@@ -72,7 +72,7 @@ public class SavingProductsApiResource {
public String retrieveAllSavingProducts(@Context final UriInfo uriInfo) { public String retrieveAllSavingProducts(@Context final UriInfo uriInfo) {
Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "name", "description", "createdOn", "lastModifedOn", Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "name", "description", "createdOn", "lastModifedOn",
"interestRate","currencyCode","digitsAfterDecimal")); "interestRate","currencyCode","digitsAfterDecimal","minimumBalance","maximumBalance"));
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
if (responseParameters.isEmpty()) { if (responseParameters.isEmpty()) {
@@ -92,7 +92,7 @@ public class SavingProductsApiResource {
public String retrieveSavingProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) { public String retrieveSavingProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) {
Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "name", "description", "createdOn", "lastModifedOn", Set<String> typicalResponseParameters = new HashSet<String>(Arrays.asList("id", "name", "description", "createdOn", "lastModifedOn",
"interestRate","currencyCode","digitsAfterDecimal")); "interestRate","currencyCode","digitsAfterDecimal","minimumBalance","maximumBalance"));
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
if (responseParameters.isEmpty()) { if (responseParameters.isEmpty()) {
@@ -116,7 +116,7 @@ public class SavingProductsApiResource {
public String retrieveNewSavingProductDetails(@Context final UriInfo uriInfo) { public String retrieveNewSavingProductDetails(@Context final UriInfo uriInfo) {
Set<String> typicalResponseParameters = new HashSet<String>( Set<String> typicalResponseParameters = new HashSet<String>(
Arrays.asList("id", "name", "description", "createdOn", "lastModifedOn","interestRate","currencyCode","digitsAfterDecimal", "currencyOptions")); Arrays.asList("id", "name", "description", "createdOn", "lastModifedOn","interestRate","currencyCode","digitsAfterDecimal", "currencyOptions","minimumBalance","maximumBalance"));
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
if (responseParameters.isEmpty()) { if (responseParameters.isEmpty()) {
@@ -11,13 +11,16 @@ public class SavingProductCommand {
private final String currencyCode; private final String currencyCode;
private final Integer digitsAfterDecimal; private final Integer digitsAfterDecimal;
private final BigDecimal interestRate; private final BigDecimal interestRate;
private final BigDecimal minimumBalance;
private final BigDecimal maximumBalance;
private final Set<String> modifiedParameters; private final Set<String> modifiedParameters;
public SavingProductCommand(final Set<String> modifiedParameters, public SavingProductCommand(final Set<String> modifiedParameters,
final Long id, final String name, final String description, final Long id, final String name, final String description,
final String currencyCode, final Integer digitsAfterDecimal, final String currencyCode, final Integer digitsAfterDecimal,
final BigDecimal interestRate) { final BigDecimal interestRate, final BigDecimal minimumBalance, final BigDecimal maximumBalance) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.description = description; this.description = description;
@@ -25,6 +28,9 @@ public class SavingProductCommand {
this.currencyCode = currencyCode; this.currencyCode = currencyCode;
this.digitsAfterDecimal = digitsAfterDecimal; this.digitsAfterDecimal = digitsAfterDecimal;
this.interestRate = interestRate; this.interestRate = interestRate;
this.minimumBalance=minimumBalance;
this.maximumBalance=maximumBalance;
this.modifiedParameters = modifiedParameters; this.modifiedParameters = modifiedParameters;
} }
@@ -53,6 +59,15 @@ public class SavingProductCommand {
return interestRate; return interestRate;
} }
public BigDecimal getMinimumBalance() {
return minimumBalance;
}
public BigDecimal getMaximumBalance() {
return maximumBalance;
}
public boolean isNameChanged() { public boolean isNameChanged() {
return this.modifiedParameters.contains("name"); return this.modifiedParameters.contains("name");
} }
@@ -72,4 +87,12 @@ public class SavingProductCommand {
public boolean isInterestRateChanged() { public boolean isInterestRateChanged() {
return this.modifiedParameters.contains("interestRate"); return this.modifiedParameters.contains("interestRate");
} }
public boolean isMinimumBalanceChanged(){
return this.modifiedParameters.contains("minimumBalance");
}
public boolean isMaximumBalanceChanged(){
return this.modifiedParameters.contains("maximumBalance");
}
} }
@@ -16,6 +16,8 @@ public class SavingProductData implements Serializable {
private Integer digitsAfterDecimal; private Integer digitsAfterDecimal;
private BigDecimal interestRate = BigDecimal.ZERO; private BigDecimal interestRate = BigDecimal.ZERO;
private BigDecimal minimumBalance = BigDecimal.ZERO;
private BigDecimal maximumBalance = BigDecimal.ZERO;
private DateTime createdOn; private DateTime createdOn;
private DateTime lastModifedOn; private DateTime lastModifedOn;
@@ -26,7 +28,7 @@ public class SavingProductData implements Serializable {
// //
} }
public SavingProductData(DateTime createdOn, DateTime lastModifedOn, Long id,String name, String description,BigDecimal interestRate,String currencyCode, Integer digitsAfterDecimal) { public SavingProductData(DateTime createdOn, DateTime lastModifedOn, Long id,String name, String description,BigDecimal interestRate,String currencyCode, Integer digitsAfterDecimal,BigDecimal minimumBalance,BigDecimal maximumBalance) {
this.createdOn=createdOn; this.createdOn=createdOn;
this.lastModifedOn=lastModifedOn; this.lastModifedOn=lastModifedOn;
this.id=id; this.id=id;
@@ -35,6 +37,8 @@ public class SavingProductData implements Serializable {
this.interestRate=interestRate; this.interestRate=interestRate;
this.currencyCode=currencyCode; this.currencyCode=currencyCode;
this.digitsAfterDecimal=digitsAfterDecimal; this.digitsAfterDecimal=digitsAfterDecimal;
this.minimumBalance=minimumBalance;
this.maximumBalance=maximumBalance;
} }
public Long getId() { public Long getId() {
@@ -108,4 +112,21 @@ public class SavingProductData implements Serializable {
public void setCurrencyOptions(List<CurrencyData> currencyOptions) { public void setCurrencyOptions(List<CurrencyData> currencyOptions) {
this.currencyOptions = currencyOptions; this.currencyOptions = currencyOptions;
} }
public BigDecimal getMinimumBalance() {
return minimumBalance;
}
public void setMinimumBalance(BigDecimal minimumBalance) {
this.minimumBalance = minimumBalance;
}
public BigDecimal getMaximumBalance() {
return maximumBalance;
}
public void setMaximumBalance(BigDecimal maximumBalance) {
this.maximumBalance = maximumBalance;
}
} }
@@ -1447,7 +1447,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
Type typeOfMap = new TypeToken<Map<String, String>>() {}.getType(); Type typeOfMap = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap); Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>(Arrays.asList("name","description","currencyCode", "digitsAfterDecimal","interestRate","locale")); Set<String> supportedParams = new HashSet<String>(Arrays.asList("name","description","currencyCode", "digitsAfterDecimal","interestRate","locale","minimumBalance","maximumBalance"));
checkForUnsupportedParameters(requestMap, supportedParams); checkForUnsupportedParameters(requestMap, supportedParams);
Set<String> modifiedParameters = new HashSet<String>(); Set<String> modifiedParameters = new HashSet<String>();
String name = extractStringParameter("name", requestMap,modifiedParameters); String name = extractStringParameter("name", requestMap,modifiedParameters);
@@ -1455,9 +1455,11 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
String currencyCode=extractStringParameter("currencyCode", requestMap,modifiedParameters); String currencyCode=extractStringParameter("currencyCode", requestMap,modifiedParameters);
Integer digitsAfterDecimalValue = extractIntegerParameter("digitsAfterDecimal", requestMap, modifiedParameters); Integer digitsAfterDecimalValue = extractIntegerParameter("digitsAfterDecimal", requestMap, modifiedParameters);
BigDecimal interestRate = extractBigDecimalParameter("interestRate", requestMap, modifiedParameters); BigDecimal interestRate = extractBigDecimalParameter("interestRate", requestMap, modifiedParameters);
BigDecimal minimumBalance=extractBigDecimalParameter("minimumBalance", requestMap, modifiedParameters);
BigDecimal maximumBalance=extractBigDecimalParameter("maximumBalance", requestMap, modifiedParameters);
return new SavingProductCommand(modifiedParameters, resourceIdentifier,name, description,currencyCode,digitsAfterDecimalValue,interestRate); return new SavingProductCommand(modifiedParameters, resourceIdentifier,name, description,currencyCode,digitsAfterDecimalValue,interestRate,minimumBalance,maximumBalance);
} }
@Override @Override
@@ -1465,7 +1467,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
Set<String> responseParameters, SavingProductData... products) { Set<String> responseParameters, SavingProductData... products) {
Set<String> supportedParameters = new HashSet<String>( Set<String> supportedParameters = new HashSet<String>(
Arrays.asList("id", "name", "description","createdOn", "lastModifedOn","interestRate","currencyCode","digitsAfterDecimal", "currencyOptions")); Arrays.asList("id", "name", "description","createdOn", "lastModifedOn","interestRate","currencyCode","digitsAfterDecimal", "currencyOptions", "minimumBalance","maximumBalance"));
final Set<String> parameterNamesToSkip = new HashSet<String>(); final Set<String> parameterNamesToSkip = new HashSet<String>();
@@ -0,0 +1,42 @@
package org.mifosng.platform.loan.domain;
public enum SavingTypeMethod {
FIXEDTERM_DEPOSITS(0,"savingtype.fixedterm"),OTHER(1,"savingtype.other"),INVALID(2,"savingtype.invalid");
private final Integer value;
private final String code;
private SavingTypeMethod(final Integer value,final String code){
this.value=value;
this.code=code;
}
public Integer getValue() {
return this.value;
}
public String getCode() {
return code;
}
public static SavingTypeMethod fromInt(final Integer selectedType){
SavingTypeMethod savingTypeMethod=null;
switch (selectedType) {
case 0:
savingTypeMethod=SavingTypeMethod.FIXEDTERM_DEPOSITS;
break;
case 1:
savingTypeMethod=SavingTypeMethod.OTHER;
break;
default:
savingTypeMethod=SavingTypeMethod.INVALID;
break;
}
return savingTypeMethod;
}
}
@@ -35,14 +35,14 @@ public class SavingProduct extends AbstractAuditableCustom<AppUser, Long> {
this.savingProductRelatedDetail = null; this.savingProductRelatedDetail = null;
} }
public SavingProduct(final String name, final String description, final MonetaryCurrency currency,final BigDecimal interestRate) { public SavingProduct(final String name, final String description, final MonetaryCurrency currency,final BigDecimal interestRate, final BigDecimal minimumBalance,final BigDecimal maximumBalance) {
this.name = name.trim(); this.name = name.trim();
if (StringUtils.isNotBlank(description)) { if (StringUtils.isNotBlank(description)) {
this.description = description.trim(); this.description = description.trim();
} else { } else {
this.description = null; this.description = null;
} }
this.savingProductRelatedDetail=new SavingProductRelatedDetail(currency, interestRate); this.savingProductRelatedDetail=new SavingProductRelatedDetail(currency, interestRate,minimumBalance,maximumBalance);
} }
public String getName() { public String getName() {
@@ -61,6 +61,14 @@ public class SavingProduct extends AbstractAuditableCustom<AppUser, Long> {
return this.savingProductRelatedDetail.getInterestRate(); return this.savingProductRelatedDetail.getInterestRate();
} }
public BigDecimal getMinimumBalance(){
return this.savingProductRelatedDetail.getMinimumBalance();
}
public BigDecimal getMaximumBalance(){
return this.savingProductRelatedDetail.getMaximumBalance();
}
public boolean isDeleted() { public boolean isDeleted() {
return deleted; return deleted;
} }
@@ -18,13 +18,23 @@ public class SavingProductRelatedDetail {
@Column(name = "interest_rate", scale = 6, precision = 19, nullable = false) @Column(name = "interest_rate", scale = 6, precision = 19, nullable = false)
private BigDecimal interestRate; private BigDecimal interestRate;
@Column(name = "minimum_balance", scale = 6, precision = 19, nullable = false)
private BigDecimal minimumBalance;
@Column(name = "maximum_balance", scale = 6, precision = 19, nullable = false)
private BigDecimal maximumBalance;
public SavingProductRelatedDetail() { public SavingProductRelatedDetail() {
this.interestRate=null; this.interestRate=null;
this.maximumBalance=null;
this.minimumBalance=null;
} }
public SavingProductRelatedDetail(final MonetaryCurrency currency,final BigDecimal interestRate) { public SavingProductRelatedDetail(final MonetaryCurrency currency,final BigDecimal interestRate, final BigDecimal minimumBalance,final BigDecimal maximumBalance) {
this.currency=currency; this.currency=currency;
this.interestRate=interestRate; this.interestRate=interestRate;
this.minimumBalance=minimumBalance;
this.maximumBalance=maximumBalance;
} }
public MonetaryCurrency getCurrency() { public MonetaryCurrency getCurrency() {
@@ -35,6 +45,14 @@ public class SavingProductRelatedDetail {
return BigDecimal.valueOf(Double.valueOf(this.interestRate.stripTrailingZeros().toString())); return BigDecimal.valueOf(Double.valueOf(this.interestRate.stripTrailingZeros().toString()));
} }
public BigDecimal getMinimumBalance(){
return BigDecimal.valueOf(Double.valueOf(this.minimumBalance.stripTrailingZeros().toString()));
}
public BigDecimal getMaximumBalance(){
return BigDecimal.valueOf(Double.valueOf(this.maximumBalance.stripTrailingZeros().toString()));
}
public void update(SavingProductCommand command){ public void update(SavingProductCommand command){
Integer digitsAfterDecimalChanged = this.currency.getDigitsAfterDecimal(); Integer digitsAfterDecimalChanged = this.currency.getDigitsAfterDecimal();
if (command.isDigitsAfterDecimalChanged()) { if (command.isDigitsAfterDecimalChanged()) {
@@ -53,5 +71,13 @@ public class SavingProductRelatedDetail {
if (command.isInterestRateChanged()) { if (command.isInterestRateChanged()) {
this.interestRate = command.getInterestRate(); this.interestRate = command.getInterestRate();
} }
if(command.isMaximumBalanceChanged()){
this.minimumBalance=command.getMinimumBalance();
}
if(command.isMaximumBalanceChanged()){
this.maximumBalance=command.getMaximumBalance();
}
} }
} }
@@ -27,7 +27,12 @@ public class SavingProductCommandValidator {
baseDataValidator.reset().parameter("currencyCode").value(command.getCurrencyCode()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("currencyCode").value(command.getCurrencyCode()).ignoreIfNull().notBlank();
baseDataValidator.reset().parameter("digitsAfterDecimal").value(command.getDigitsAfterDecimal()).ignoreIfNull().notNull().inMinMaxRange(0, 6); baseDataValidator.reset().parameter("digitsAfterDecimal").value(command.getDigitsAfterDecimal()).ignoreIfNull().notNull().inMinMaxRange(0, 6);
baseDataValidator.reset().parameter("interestRate").value(command.getInterestRate()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("interestRate").value(command.getInterestRate()).ignoreIfNull().notBlank();
baseDataValidator.reset().anyOfNotNull(command.getName(), command.getDescription(),command.getCurrencyCode(),command.getDigitsAfterDecimal(),command.getInterestRate()); baseDataValidator.reset().parameter("maximumBalance").value(command.getMaximumBalance()).notNull();
baseDataValidator.reset().parameter("minimumBalance").value(command.getMinimumBalance()).notNull();
baseDataValidator.reset().parameter("maximumBalance").value(command.getMaximumBalance()).zeroOrPositiveAmount();
baseDataValidator.reset().parameter("minimumBalance").value(command.getMinimumBalance()).zeroOrPositiveAmount();
baseDataValidator.reset().comapareMinimumAndMaximumAmounts(command.getMinimumBalance(), command.getMaximumBalance());
baseDataValidator.reset().anyOfNotNull(command.getName(), command.getDescription(),command.getCurrencyCode(),command.getDigitsAfterDecimal(),command.getInterestRate(),command.getMinimumBalance(),command.getMaximumBalance());
if (!dataValidationErrors.isEmpty()) { if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
@@ -44,7 +49,11 @@ public class SavingProductCommandValidator {
baseDataValidator.reset().parameter("currencyCode").value(command.getCurrencyCode()).notBlank(); baseDataValidator.reset().parameter("currencyCode").value(command.getCurrencyCode()).notBlank();
baseDataValidator.reset().parameter("digitsAfterDecimal").value(command.getDigitsAfterDecimal()).notNull().inMinMaxRange(0, 6); baseDataValidator.reset().parameter("digitsAfterDecimal").value(command.getDigitsAfterDecimal()).notNull().inMinMaxRange(0, 6);
baseDataValidator.reset().parameter("interestRate").value(command.getInterestRate()).notNull(); baseDataValidator.reset().parameter("interestRate").value(command.getInterestRate()).notNull();
baseDataValidator.reset().parameter("maximumBalance").value(command.getMaximumBalance()).notNull();
baseDataValidator.reset().parameter("minimumBalance").value(command.getMinimumBalance()).notNull();
baseDataValidator.reset().parameter("maximumBalance").value(command.getMaximumBalance()).zeroOrPositiveAmount();
baseDataValidator.reset().parameter("minimumBalance").value(command.getMinimumBalance()).zeroOrPositiveAmount();
baseDataValidator.reset().comapareMinimumAndMaximumAmounts(command.getMinimumBalance(), command.getMaximumBalance());
if (!dataValidationErrors.isEmpty()) { if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
} }
@@ -92,7 +92,7 @@ public class SavingProductReadPlatformServiceImpl implements
private static final class SavingProductMapper implements RowMapper<SavingProductData> { private static final class SavingProductMapper implements RowMapper<SavingProductData> {
public String savingProductSchema(){ public String savingProductSchema(){
return "sp.id as id,sp.name as name, sp.description as description,sp.currency_code as currencyCode, sp.currency_digits as currencyDigits,sp.interest_rate as interestRate,sp.created_date as createdon, sp.lastmodified_date as modifiedon, " return "sp.id as id,sp.name as name, sp.description as description,sp.currency_code as currencyCode, sp.currency_digits as currencyDigits,sp.interest_rate as interestRate,sp.minimum_balance as minimumBalance,sp.maximum_balance as maximumBalance,sp.created_date as createdon, sp.lastmodified_date as modifiedon, "
+ "curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, curr.display_symbol as currencyDisplaySymbol" + "curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, curr.display_symbol as currencyDisplaySymbol"
+ " from portfolio_product_savings sp join ref_currency curr on curr.code = sp.currency_code"; + " from portfolio_product_savings sp join ref_currency curr on curr.code = sp.currency_code";
} }
@@ -117,7 +117,10 @@ public class SavingProductReadPlatformServiceImpl implements
DateTime createdOn = JdbcSupport.getDateTime(rs, "createdon"); DateTime createdOn = JdbcSupport.getDateTime(rs, "createdon");
DateTime lastModifedOn = JdbcSupport.getDateTime(rs, "modifiedon"); DateTime lastModifedOn = JdbcSupport.getDateTime(rs, "modifiedon");
return new SavingProductData(createdOn, lastModifedOn, id, name,description,interestRate,currencyCode,currencyDigits); BigDecimal minimumBalance=rs.getBigDecimal("minimumBalance");
BigDecimal maximumBalance=rs.getBigDecimal("maximumBalance");
return new SavingProductData(createdOn, lastModifedOn, id, name,description,interestRate,currencyCode,currencyDigits,minimumBalance,maximumBalance);
} }
} }
@@ -34,7 +34,7 @@ public class SavingProductWritePlatformServiceJpaRepositoryImpl implements Savin
MonetaryCurrency currency = new MonetaryCurrency(command.getCurrencyCode(), command.getDigitsAfterDecimal()); MonetaryCurrency currency = new MonetaryCurrency(command.getCurrencyCode(), command.getDigitsAfterDecimal());
SavingProduct product = new SavingProduct(command.getName(),command.getDescription(),currency,command.getInterestRate()); SavingProduct product = new SavingProduct(command.getName(),command.getDescription(),currency,command.getInterestRate(),command.getMinimumBalance(),command.getMaximumBalance());
this.savingProductRepository.save(product); this.savingProductRepository.save(product);
return new EntityIdentifier(product.getId()); return new EntityIdentifier(product.getId());
} }
@@ -59,6 +59,8 @@ public class SavingProductWritePlatformServiceJpaRepositoryImpl implements Savin
@Transactional @Transactional
@Override @Override
public EntityIdentifier deleteSavingProduct(Long productId) { public EntityIdentifier deleteSavingProduct(Long productId) {
this.context.authenticatedUser();
SavingProduct product=this.savingProductRepository.findOne(productId); SavingProduct product=this.savingProductRepository.findOne(productId);
if (product==null || product.isDeleted()) { if (product==null || product.isDeleted()) {
throw new ProductNotFoundException(productId); throw new ProductNotFoundException(productId);
@@ -5,7 +5,7 @@
driverClassName="com.mysql.jdbc.Driver" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mifosplatform-tenants" url="jdbc:mysql://localhost:3306/mifosplatform-tenants"
username="root" username="root"
password="mysql" password="mifos"
validationQuery="select 1" validationQuery="select 1"
maxActive="10" maxActive="10"
maxIdle="4" maxIdle="4"