MIFOSX-748: update api documentation, resolve null pointers when creating charge with empty request.

This commit is contained in:
Keith Woodlock
2013-10-19 21:48:27 +01:00
parent 961e581f63
commit 0f2685c63c
6 changed files with 514 additions and 452 deletions
+117 -88
View File
@@ -1506,6 +1506,10 @@
<td>loans/{loanId}/transactions/template</td> <td>loans/{loanId}/transactions/template</td>
<td><a href="#loans_repaymenttemplate_etc">Retrieve Loan Transaction Template</a></td> <td><a href="#loans_repaymenttemplate_etc">Retrieve Loan Transaction Template</a></td>
</tr> </tr>
<tr>
<td>charges/template</td>
<td><a href="#charges_template">Retrieve Charge Template</a></td>
</tr>
<tr> <tr>
<td>offices/template</td> <td>offices/template</td>
<td><a href="#offices_template">Retrieve Office Template</a></td> <td><a href="#offices_template">Retrieve Office Template</a></td>
@@ -10986,10 +10990,10 @@ Request Body:
<h3>Charges</h3> <h3>Charges</h3>
<p> <p>
Its typical for MFIs to add extra costs for their financial Its typical for MFIs to add extra costs for their financial
products. There are typically <b>Fees</b> or <b>Penalties</b>. products. These are typically <b>Fees</b> or <b>Penalties</b>.
</p> </p>
<p>Charges is what we use to model both fees and penalties. <p>A <strong><i>Charge</i></strong> on mifos platform is what we use to model both <b>Fees</b> and <b>Penalties</b>.</p>
For now charges can only be associated with loan products / loans.</p> <p>At present we support defining charges for use in both loan and saving products.</p>
<table class=matrixHeading> <table class=matrixHeading>
<tr class="matrixHeadingBG"> <tr class="matrixHeadingBG">
<td><div class="mifosXHeading2">Field Descriptions</div></td> <td><div class="mifosXHeading2">Field Descriptions</div></td>
@@ -11000,62 +11004,99 @@ Request Body:
<tr> <tr>
<td class=fielddesc>Name associated with this charge.</td> <td class=fielddesc>Name associated with this charge.</td>
</tr> </tr>
<tr class=alt>
<td>chargeAppliesTo</td>
</tr>
<tr>
<td class=fielddesc>Enumeration for indicating whether charge is to be applicable for loans or savings.<br/>
1=Loans,
2=Savings
<p>Once a charge definiton has been created, this attribute cannot be changed at any point.</p>
</td>
</tr>
<tr class=alt> <tr class=alt>
<td>active</td> <td>active</td>
</tr> </tr>
<tr> <tr>
<td class=fielddesc>Boolean flag determines if the Charge is currently active.</td> <td class=fielddesc>Boolean flag determines if the charge is currently active.</td>
</tr> </tr>
<tr class=alt> <tr class=alt>
<td>penalty</td> <td>penalty</td>
</tr> </tr>
<tr> <tr>
<td class=fielddesc>Boolean flag determines if the Charge is a penalty.</td> <td class=fielddesc>Boolean flag determines if the charge is a <b>penalty</b>. If false the charge is considered a <b>Fee</b></td>
</tr> </tr>
<tr class=alt> <tr class=alt>
<td>currency</td> <td>currencyCode</td>
</tr> </tr>
<tr> <tr>
<td class=fielddesc>Details of the currency associated with this charge. <td class=fielddesc>A three letter ISO code of currency.</td>
Refer <a href="#charges_template">Charges Template</a> for additional details</td>
</tr>
<tr class=alt>
<td>amount</td>
</tr>
<tr>
<td class=fielddesc>Field holds the details of the actual amount to be collected
in the case of "Flat Charges" or the percentage amount to be collected in
case of "Percentage Amount Charges". Refer <a href="#charges_template">Charges Template</a>
for details of the Available Charge Types</td>
</tr>
<tr class=alt>
<td>chargeTimeType</td>
</tr>
<tr>
<td class=fielddesc>The time at which the charge becomes Due.
Refer <a href="#charges_template">Charges Template</a> for additional details<br/>
1 = Disbursement : Applicable for loans and deducted at the time of loan disbursement.<br/>
2 = Specified Due Date : Adhoc charge can be applied for loans and savings on a specified due date.<br/>
3 = Savings Activation : This charge is applicable for savings account and charged at the time of account activation. This charge will be autodeducted once the account is activated with sufficient opening balance.<br/>
5 = Withdrawal fee : Charge applied to every withdrawal of savings account.<br/>
6 = Annual Fee : Recurring charge applied annually for savings on a specified Month and day.<br/>
7 = Monthly Fee : Recurring charge applied on regular interval of months for savings.
</td>
</tr>
<tr class=alt>
<td>chargeAppliesTo</td>
</tr>
<tr>
<td class=fielddesc>The Entity for which the charge can be applied (Loans, Savings etc).
Refer <a href="#charges_template">Charges Template</a> for additional details</td>
</tr> </tr>
<tr class=alt> <tr class=alt>
<td>chargeCalculationType</td> <td>chargeCalculationType</td>
</tr> </tr>
<tr> <tr>
<td class=fielddesc>Rules for calculating the amount for a particular Charge. <td class=fielddesc>Enumeration for indicating whether charge amount is <b>flat</b> or <b>percentage</b> based:<br/>
Refer <a href="#charges_template">Charges Template</a> for additional details</td> 1=Flat,
2=% of Amount
<p>Used in combination with <i>amount</i> parameter e.g 1 <b>% of Amount</b> or 3.50 <b>Flat</b></p>
<p>For loans, % of Amount refers to the loan principal disbursed.</p>
<p>For savings, % of Amount can be used with 'withrawal fees' and refers to the amount withdrawn.</p>
</td>
</tr> </tr>
<tr class=alt>
<td>amount</td>
</tr>
<tr>
<td class=fielddesc>The charge amount. Used in combination with <i>chargeCalculationType</i> parameter. e.g <b>1</b> % of Amount or <b>3.50</b> Flat</td>
</tr>
<tr class=alt>
<td>minCap</td>
</tr>
<tr>
<td class=fielddesc><b>Optional</b>: Can be used when a '% of Amount' value is used for <i>chargeCalculationType</i>.
<p>Used to enforce a minimum charge amount in cases where the calculated amount is less than the minimum amount provided.</p>
<p>e.g. A 2% fee with a minimum cap of 500:</br>
In case of a 5000 loan, the 2% is 100, and therefore automatically 500 is used as the value of the charge.
</p>
</td>
</tr>
<tr class=alt>
<td>maxCap</td>
</tr>
<tr>
<td class=fielddesc><b>Optional</b>: Can be used when a '% of Amount' value is used for <i>chargeCalculationType</i>.
<p>Used to enforce a maximum charge amount in cases where the calculated amount is greater than the maximum amount provided.</p>
<p>e.g. A 2% fee, with a maximum of 2000.:</br>
In case of a 150000 loan, the 2% adds up to 3000 charge, and therefore the maximum cap of 2000 will be used.
</p>
</td>
</tr>
<tr class=alt>
<td>chargeTimeType</td>
</tr>
<tr>
<td class=fielddesc>An enumeration indicating the time at which the charge becomes due:<br/>
<p>
1 = Disbursement : Applicable for loans and deducted at the time of loan disbursement.<br/>
2 = Specified Due Date : Adhoc charge can be applied for loans and savings on a specified due date.<br/>
3 = Savings Activation : This charge is applicable for savings account and charged at the time of account activation. This charge will be autodeducted once the account is activated with sufficient opening balance.<br/>
5 = Withdrawal fee : Charge applied to every withdrawal of savings account.<br/>
6 = Annual Fee : Recurring charge applied annually for savings on a specified Month and day. see <i>feeOnMonthDay</i><br/>
7 = Monthly Fee : Recurring charge applied on regular interval of months for savings. see <i>feeOnMonthDay</i> and <i>feeInterval</i>
</p>
</td>
</tr>
<tr class=alt>
<td>chargePaymentMode</td>
</tr>
<tr>
<td class=fielddesc><b>Applicable to loan charges only:</b> Enumeration for indicating whether charge is to be paid through an <i>Account Transfer</i> from savings or through <i>Regular</i> payment mode.<br/>
0=Regular,
1=Account Transfer
</td>
</tr>
<tr class=alt> <tr class=alt>
<td>feeOnMonthDay</td> <td>feeOnMonthDay</td>
</tr> </tr>
@@ -11071,36 +11112,15 @@ Request Body:
<td class=fielddesc>Fee to be applied on a specified interval (number of months).<br/> <td class=fielddesc>Fee to be applied on a specified interval (number of months).<br/>
This field is mandatory if <i>chargeTimeType</i> is of type <b>Monthly Fee</b> This field is mandatory if <i>chargeTimeType</i> is of type <b>Monthly Fee</b>
</td> </td>
</tr>
<tr class=alt>
<td>minCap</td>
</tr>
<tr>
<td class=fielddesc>minimum cap: a 2% fee with a minimum cap of 500<br/>
In case of a 5000 loan, the 2% is 100, and therefore automatically 500 is used as the value of the charge.<br/>
This field is optional and can be used along when ChargeCalculationType equals (2) PERCENT_OF_AMOUNT
</td>
</tr>
<tr class=alt>
<td>maxCap</td>
</tr>
<tr>
<td class=fielddesc>maximum cap: A 2% fee, with a maximum of 2000. <br/>
In case of a 150000 loan, the 2% adds up to 3000 charge, and therefore the maximum cap of 2000 will be used. <br />
This field is optional and can be used along when ChargeCalculationType equals (2) PERCENT_OF_AMOUNT
</td>
</tr> </tr>
</table> </table>
</div> </div>
</div> </div>
<a id="charges_template" name="charges_template" <a id="charges_template" name="charges_template" class="old-syle-anchor">&nbsp;</a>
class="old-syle-anchor">&nbsp;</a>
<div class="method-section"> <div class="method-section">
<div class="method-description"> <div class="method-description">
<h4>Retrieve Charges Details Template</h4> <h4>Retrieve Charge Template</h4>
<p>This is a convenience resource. It can be useful when <p>This is a convenience resource. It can be useful when
building maintenance user interface screens for client building maintenance user interface screens for client
applications. The template data returned consists of any or all applications. The template data returned consists of any or all
@@ -11121,8 +11141,7 @@ GET https://DomainName/api/v1/charges/template
{ {
"active": false, "active": false,
"penalty": false, "penalty": false,
"currencyOptions": "currencyOptions": [
[
{ {
"code": "USD", "code": "USD",
"name": "US Dollar", "name": "US Dollar",
@@ -11132,8 +11151,7 @@ GET https://DomainName/api/v1/charges/template
"displayLabel": "US Dollar ($)" "displayLabel": "US Dollar ($)"
} }
], ],
"chargeCalculationTypeOptions": "chargeCalculationTypeOptions": [
[
{ {
"id": 1, "id": 1,
"code": "chargeCalculationType.flat", "code": "chargeCalculationType.flat",
@@ -11145,8 +11163,7 @@ GET https://DomainName/api/v1/charges/template
"value": "% Amount" "value": "% Amount"
} }
], ],
"chargeAppliesToOptions": "chargeAppliesToOptions": [
[
{ {
"id": 1, "id": 1,
"code": "chargeAppliesTo.loan", "code": "chargeAppliesTo.loan",
@@ -11158,8 +11175,7 @@ GET https://DomainName/api/v1/charges/template
"value": "Savings" "value": "Savings"
} }
], ],
"chargeTimeTypeOptions": "chargeTimeTypeOptions": [
[
{ {
"id": 1, "id": 1,
"code": "chargeTimeType.disbursement", "code": "chargeTimeType.disbursement",
@@ -11191,64 +11207,78 @@ GET https://DomainName/api/v1/charges/template
"value": "Monthly Fee" "value": "Monthly Fee"
} }
], ],
"chargePaymetModeOptions": "chargePaymetModeOptions": [
[
{ {
"id": 0, "id": 0,
"code": "chargepaymentmode.regular", "code": "chargepaymentmode.regular",
"value":"chargepaymentmode.regular" "value": "Regular"
}, },
{ {
"id": 1, "id": 1,
"code": "chargepaymentmode.accounttransfer", "code": "chargepaymentmode.accounttransfer",
"value":"chargepaymentmode.accounttransfer" "value": "Account transfer"
} }
], ],
"loanChargeCalculationTypeOptions" : [ { "code" : "chargeCalculationType.flat", "loanChargeCalculationTypeOptions": [
{
"id": 1, "id": 1,
"code": "chargeCalculationType.flat",
"value": "Flat" "value": "Flat"
}, },
{ "code" : "chargeCalculationType.percent.of.amount", {
"id": 2, "id": 2,
"code": "chargeCalculationType.percent.of.amount",
"value": "% Amount" "value": "% Amount"
} }
], ],
"loanChargeTimeTypeOptions" : [ { "code" : "chargeTimeType.disbursement", "loanChargeTimeTypeOptions": [
{
"id": 1, "id": 1,
"code": "chargeTimeType.disbursement",
"value": "Disbursement" "value": "Disbursement"
}, },
{ "code" : "chargeTimeType.specifiedDueDate", {
"id": 2, "id": 2,
"code": "chargeTimeType.specifiedDueDate",
"value": "Specified due date" "value": "Specified due date"
} }
], ],
"savingsChargeCalculationTypeOptions" : [ { "code" : "chargeCalculationType.flat", "savingsChargeCalculationTypeOptions": [
{
"id": 1, "id": 1,
"code": "chargeCalculationType.flat",
"value": "Flat" "value": "Flat"
}, },
{ "code" : "chargeCalculationType.percent.of.amount", {
"id": 2, "id": 2,
"code": "chargeCalculationType.percent.of.amount",
"value": "% Amount" "value": "% Amount"
} }
], ],
"savingsChargeTimeTypeOptions" : [ { "code" : "chargeTimeType.specifiedDueDate", "savingsChargeTimeTypeOptions": [
{
"id": 2, "id": 2,
"code": "chargeTimeType.specifiedDueDate",
"value": "Specified due date" "value": "Specified due date"
}, },
{ "code" : "chargeTimeType.savingsActivation", {
"id": 3, "id": 3,
"code": "chargeTimeType.savingsActivation",
"value": "Savings Activation" "value": "Savings Activation"
}, },
{ "code" : "chargeTimeType.withdrawalFee", {
"id": 5, "id": 5,
"code": "chargeTimeType.withdrawalFee",
"value": "Withdrawal Fee" "value": "Withdrawal Fee"
}, },
{ "code" : "chargeTimeType.annualFee", {
"id": 6, "id": 6,
"code": "chargeTimeType.annualFee",
"value": "Annual Fee" "value": "Annual Fee"
}, },
{ "code" : "chargeTimeType.monthlyFee", {
"id": 7, "id": 7,
"code": "chargeTimeType.monthlyFee",
"value": "Monthly Fee" "value": "Monthly Fee"
} }
] ]
@@ -11261,8 +11291,7 @@ GET https://DomainName/api/v1/charges/template
<div class="method-section"> <div class="method-section">
<div class="method-description"> <div class="method-description">
<h4>Create/Define a Charge</h4> <h4>Create/Define a Charge</h4>
<p>Define a new charge specific to loan or saving that can later be associated with loan <p>Define a new charge that can later be associated with loans and savings through their respective product definitions or directly on each account instance.</p>
products, loans Savings product or Savings account.</p>
</div> </div>
<div class="method-example"> <div class="method-example">
<code class="method-declaration"> <code class="method-declaration">
@@ -5,10 +5,12 @@
*/ */
package org.mifosplatform.portfolio.charge.domain; package org.mifosplatform.portfolio.charge.domain;
public enum ChargeAppliesTo { public enum ChargeAppliesTo {
INVALID(0, "chargeAppliesTo.invalid"), // INVALID(0, "chargeAppliesTo.invalid"), //
LOAN(1, "chargeAppliesTo.loan"), SAVINGS(2, "chargeAppliesTo.savings"); LOAN(1, "chargeAppliesTo.loan"), //
SAVINGS(2, "chargeAppliesTo.savings");
private final Integer value; private final Integer value;
private final String code; private final String code;
@@ -26,16 +28,10 @@ public enum ChargeAppliesTo {
return this.code; return this.code;
} }
public static int minValue() {
return 1;
}
public static int maxValue() {
return 2;// modify whenever a new value added
}
public static ChargeAppliesTo fromInt(final Integer chargeAppliesTo) { public static ChargeAppliesTo fromInt(final Integer chargeAppliesTo) {
ChargeAppliesTo chargeAppliesToType = ChargeAppliesTo.INVALID; ChargeAppliesTo chargeAppliesToType = ChargeAppliesTo.INVALID;
if (chargeAppliesTo != null) {
switch (chargeAppliesTo) { switch (chargeAppliesTo) {
case 1: case 1:
chargeAppliesToType = LOAN; chargeAppliesToType = LOAN;
@@ -47,6 +43,8 @@ public enum ChargeAppliesTo {
chargeAppliesToType = INVALID; chargeAppliesToType = INVALID;
break; break;
} }
}
return chargeAppliesToType; return chargeAppliesToType;
} }
@@ -57,4 +55,8 @@ public enum ChargeAppliesTo {
public boolean isSavingsCharge() { public boolean isSavingsCharge() {
return this.value.equals(ChargeAppliesTo.SAVINGS.getValue()); return this.value.equals(ChargeAppliesTo.SAVINGS.getValue());
} }
public static Object[] validValues() {
return new Object[] {ChargeAppliesTo.LOAN.getValue(), ChargeAppliesTo.SAVINGS.getValue()};
}
} }
@@ -29,6 +29,10 @@ public enum ChargeCalculationType {
return this.code; return this.code;
} }
public static Object[] validValues() {
return new Integer[] { ChargeCalculationType.FLAT.getValue(), ChargeCalculationType.PERCENT_OF_AMOUNT.getValue() };
}
public static ChargeCalculationType fromInt(final Integer chargeCalculation) { public static ChargeCalculationType fromInt(final Integer chargeCalculation) {
ChargeCalculationType chargeCalculationType = ChargeCalculationType.INVALID; ChargeCalculationType chargeCalculationType = ChargeCalculationType.INVALID;
switch (chargeCalculation) { switch (chargeCalculation) {
@@ -21,6 +21,10 @@ public enum ChargePaymentMode {
return this.code; return this.code;
} }
public static Object[] validValues() {
return new Integer[] { ChargePaymentMode.REGULAR.getValue(), ChargePaymentMode.ACCOUNT_TRANSFER.getValue() };
}
public static ChargePaymentMode fromInt(final Integer paymentMode) { public static ChargePaymentMode fromInt(final Integer paymentMode) {
ChargePaymentMode chargeAppliesToType = ChargePaymentMode.REGULAR; ChargePaymentMode chargeAppliesToType = ChargePaymentMode.REGULAR;
switch (paymentMode) { switch (paymentMode) {
@@ -9,8 +9,10 @@ public enum ChargeTimeType {
INVALID(0, "chargeTimeType.invalid"), // INVALID(0, "chargeTimeType.invalid"), //
DISBURSEMENT(1, "chargeTimeType.disbursement"), // only for loan charges DISBURSEMENT(1, "chargeTimeType.disbursement"), // only for loan charges
SPECIFIED_DUE_DATE(2, "chargeTimeType.specifiedDueDate"), // for loan and savings charges SPECIFIED_DUE_DATE(2, "chargeTimeType.specifiedDueDate"), // for loan and
SAVINGS_ACTIVATION(3, "chargeTimeType.savingsActivation"), // only for savings // savings charges
SAVINGS_ACTIVATION(3, "chargeTimeType.savingsActivation"), // only for
// savings
SAVINGS_CLOSURE(4, "chargeTimeType.savingsClosure"), // only for savings SAVINGS_CLOSURE(4, "chargeTimeType.savingsClosure"), // only for savings
WITHDRAWAL_FEE(5, "chargeTimeType.withdrawalFee"), // only for savings WITHDRAWAL_FEE(5, "chargeTimeType.withdrawalFee"), // only for savings
ANNUAL_FEE(6, "chargeTimeType.annualFee"), // only for savings ANNUAL_FEE(6, "chargeTimeType.annualFee"), // only for savings
@@ -32,20 +34,19 @@ public enum ChargeTimeType {
return this.code; return this.code;
} }
public static int minValue() { public static Object[] validLoanValues() {
return 1; return new Integer[] { ChargeTimeType.DISBURSEMENT.getValue(), ChargeTimeType.SPECIFIED_DUE_DATE.getValue() };
} }
public static int maxValue() { public static Object[] validSavingsValues() {
int max = 1;// Default it to one (1) return new Integer[] { ChargeTimeType.SPECIFIED_DUE_DATE.getValue(), ChargeTimeType.SAVINGS_ACTIVATION.getValue(),
for (ChargeTimeType chargeTimeType : ChargeTimeType.values()) { ChargeTimeType.SAVINGS_CLOSURE.getValue(), ChargeTimeType.WITHDRAWAL_FEE.getValue(), ChargeTimeType.ANNUAL_FEE.getValue(),
max = (chargeTimeType.getValue() > max) ? chargeTimeType.getValue() : max; ChargeTimeType.MONTHLY_FEE.getValue() };
}
return max;
} }
public static ChargeTimeType fromInt(final Integer chargeTime) { public static ChargeTimeType fromInt(final Integer chargeTime) {
ChargeTimeType chargeTimeType = ChargeTimeType.INVALID; ChargeTimeType chargeTimeType = ChargeTimeType.INVALID;
if (chargeTime != null) {
switch (chargeTime) { switch (chargeTime) {
case 1: case 1:
chargeTimeType = DISBURSEMENT; chargeTimeType = DISBURSEMENT;
@@ -72,6 +73,7 @@ public enum ChargeTimeType {
chargeTimeType = INVALID; chargeTimeType = INVALID;
break; break;
} }
}
return chargeTimeType; return chargeTimeType;
} }
@@ -23,6 +23,8 @@ import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.portfolio.charge.domain.ChargeAppliesTo; import org.mifosplatform.portfolio.charge.domain.ChargeAppliesTo;
import org.mifosplatform.portfolio.charge.domain.ChargeCalculationType;
import org.mifosplatform.portfolio.charge.domain.ChargePaymentMode;
import org.mifosplatform.portfolio.charge.domain.ChargeTimeType; import org.mifosplatform.portfolio.charge.domain.ChargeTimeType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -58,41 +60,33 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer {
final JsonElement element = this.fromApiJsonHelper.parse(json); final JsonElement element = this.fromApiJsonHelper.parse(json);
final String name = this.fromApiJsonHelper.extractStringNamed("name", element); final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeAppliesTo", element);
baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull();
if (chargeAppliesTo != null) {
baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).isOneOfTheseValues(ChargeAppliesTo.validValues());
}
final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element); final ChargeAppliesTo appliesTo = ChargeAppliesTo.fromInt(chargeAppliesTo);
baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notBlank().notExceedingLengthOf(3);
final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("amount", element.getAsJsonObject());
baseDataValidator.reset().parameter("amount").value(amount).notNull().positiveAmount();
final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerNamed("chargeAppliesTo", element, Locale.getDefault());
baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull()
.inMinMaxRange(ChargeAppliesTo.minValue(), ChargeAppliesTo.maxValue());
final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerNamed("chargeTimeType", element, Locale.getDefault());
baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull()
.inMinMaxRange(ChargeTimeType.minValue(), ChargeTimeType.maxValue());
final Integer chargeCalculationType = this.fromApiJsonHelper.extractIntegerNamed("chargeCalculationType", element,
Locale.getDefault());
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType).notNull().inMinMaxRange(1, 4);
ChargeAppliesTo appliesTo = ChargeAppliesTo.fromInt(chargeAppliesTo);
if (appliesTo.isLoanCharge()) { if (appliesTo.isLoanCharge()) {
final Integer chargePaymentMode = this.fromApiJsonHelper.extractIntegerNamed("chargePaymentMode", element, Locale.getDefault()); // loan applicable validation
baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode).notNull().inMinMaxRange(0, 1); 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.validLoanValues());
} }
if (this.fromApiJsonHelper.parameterExists("penalty", element)) { final Integer chargePaymentMode = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargePaymentMode", element);
final Boolean penalty = this.fromApiJsonHelper.extractBooleanNamed("penalty", element); baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode).notNull().isOneOfTheseValues(ChargePaymentMode.validValues());
baseDataValidator.reset().parameter("penalty").value(penalty).notNull(); if (chargePaymentMode != null) {
baseDataValidator.reset().parameter("chargePaymentMode").value(chargePaymentMode).isOneOfTheseValues(ChargePaymentMode.validValues());
} }
if (this.fromApiJsonHelper.parameterExists("active", element)) { } else if (appliesTo.isSavingsCharge()) {
final Boolean active = this.fromApiJsonHelper.extractBooleanNamed("active", element); // savings applicable validation
baseDataValidator.reset().parameter("active").value(active).notNull(); 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.validSavingsValues());
} }
final ChargeTimeType ctt = ChargeTimeType.fromInt(chargeTimeType); final ChargeTimeType ctt = ChargeTimeType.fromInt(chargeTimeType);
@@ -108,6 +102,32 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer {
final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed("feeOnMonthDay", element); final MonthDay monthDay = this.fromApiJsonHelper.extractMonthDayNamed("feeOnMonthDay", element);
baseDataValidator.reset().parameter("feeOnMonthDay").value(monthDay).notNull(); baseDataValidator.reset().parameter("feeOnMonthDay").value(monthDay).notNull();
} }
}
final String name = this.fromApiJsonHelper.extractStringNamed("name", element);
baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100);
final String currencyCode = this.fromApiJsonHelper.extractStringNamed("currencyCode", element);
baseDataValidator.reset().parameter("currencyCode").value(currencyCode).notBlank().notExceedingLengthOf(3);
final BigDecimal amount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("amount", element.getAsJsonObject());
baseDataValidator.reset().parameter("amount").value(amount).notNull().positiveAmount();
if (this.fromApiJsonHelper.parameterExists("penalty", element)) {
final Boolean penalty = this.fromApiJsonHelper.extractBooleanNamed("penalty", element);
baseDataValidator.reset().parameter("penalty").value(penalty).notNull();
}
if (this.fromApiJsonHelper.parameterExists("active", element)) {
final Boolean active = this.fromApiJsonHelper.extractBooleanNamed("active", element);
baseDataValidator.reset().parameter("active").value(active).notNull();
}
final Integer chargeCalculationType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeCalculationType", element);
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType).notNull();
if (chargeCalculationType != null) {
baseDataValidator.reset().parameter("chargeCalculationType").value(chargeCalculationType).isOneOfTheseValues(ChargeCalculationType.validValues());
}
if (this.fromApiJsonHelper.parameterExists("minCap", element)) { if (this.fromApiJsonHelper.parameterExists("minCap", element)) {
final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("minCap", element.getAsJsonObject()); final BigDecimal minCap = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("minCap", element.getAsJsonObject());
@@ -131,6 +151,7 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer {
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("charge"); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("charge");
final JsonElement element = this.fromApiJsonHelper.parse(json); final JsonElement element = this.fromApiJsonHelper.parse(json);
if (this.fromApiJsonHelper.parameterExists("name", element)) { if (this.fromApiJsonHelper.parameterExists("name", element)) {
final String name = this.fromApiJsonHelper.extractStringNamed("name", element); final String name = this.fromApiJsonHelper.extractStringNamed("name", element);
baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100); baseDataValidator.reset().parameter("name").value(name).notBlank().notExceedingLengthOf(100);
@@ -157,15 +178,16 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer {
} }
if (this.fromApiJsonHelper.parameterExists("chargeAppliesTo", element)) { if (this.fromApiJsonHelper.parameterExists("chargeAppliesTo", element)) {
final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerNamed("chargeAppliesTo", element, Locale.getDefault()); final Integer chargeAppliesTo = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeAppliesTo", element);
baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull() baseDataValidator.reset().parameter("chargeAppliesTo").value(chargeAppliesTo).notNull()
.inMinMaxRange(ChargeAppliesTo.minValue(), ChargeAppliesTo.maxValue()); .isOneOfTheseValues(ChargeAppliesTo.validValues());
} }
if (this.fromApiJsonHelper.parameterExists("chargeTimeType", element)) { if (this.fromApiJsonHelper.parameterExists("chargeTimeType", element)) {
final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerNamed("chargeTimeType", element, Locale.getDefault());
final Integer chargeTimeType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed("chargeTimeType", element);
baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull() baseDataValidator.reset().parameter("chargeTimeType").value(chargeTimeType).notNull()
.inMinMaxRange(ChargeTimeType.minValue(), ChargeTimeType.maxValue()); .isOneOfTheseValues(ChargeTimeType.validLoanValues(), ChargeTimeType.validSavingsValues());
} }
if (this.fromApiJsonHelper.parameterExists("feeOnMonthDay", element)) { if (this.fromApiJsonHelper.parameterExists("feeOnMonthDay", element)) {
@@ -211,7 +233,6 @@ public final class ChargeDefinitionCommandFromApiJsonDeserializer {
} }
private void throwExceptionIfValidationWarningsExist(final List<ApiParameterError> dataValidationErrors) { private void throwExceptionIfValidationWarningsExist(final List<ApiParameterError> dataValidationErrors) {
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); }
"Validation errors exist.", dataValidationErrors); }
} }
} }