tidy up enum usuage and api problems around charges during review and testing.

This commit is contained in:
Keith Woodlock
2012-08-22 18:02:52 +01:00
parent e4f95923eb
commit 030887ad6f
9 changed files with 154 additions and 113 deletions
@@ -73,8 +73,8 @@ public class ChargesApiResource {
public String retrieveNewChargeDetails(@Context final UriInfo uriInfo) {
Set<String> typicalResponseParameters = new HashSet<String>(
Arrays.asList("name", "amount", "currency", "currencyOptions", "chargeAppliesTo", "chargeTimeType",
"chargeCalculationType", "chargeCalculationTypeOptions", "active")
Arrays.asList("id", "name", "amount", "currency", "active", "chargeAppliesTo", "chargeTimeType",
"chargeCalculationType", "chargeCalculationTypeOptions", "currencyOptions")
);
Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
@@ -3,65 +3,105 @@ package org.mifosng.platform.api.data;
import java.math.BigDecimal;
import java.util.List;
/**
* Immutable data object for charge data.
*/
public class ChargeData {
private Long id;
private String name;
private BigDecimal amount;
private String currencyCode;
private EnumOptionData chargeTimeType;
private EnumOptionData chargeAppliesTo;
private EnumOptionData chargeCalculationType;
private final Long id;
private final String name;
private final boolean active;
private final CurrencyData currency;
private final BigDecimal amount;
private final EnumOptionData chargeTimeType;
private final EnumOptionData chargeAppliesTo;
private final EnumOptionData chargeCalculationType;
private boolean active;
private final List<CurrencyData> currencyOptions;
private final List<EnumOptionData> chargeCalculationTypeOptions;
public static ChargeData template(
final EnumOptionData chargeTimeType,
final EnumOptionData chargeAppliesToType,
final EnumOptionData chargeCalculationType,
final List<CurrencyData> currencyOptions,
final List<EnumOptionData> chargeCalculationTypeOptions) {
return new ChargeData(null, null, null, null, chargeTimeType, chargeAppliesToType, chargeCalculationType, false, currencyOptions, chargeCalculationTypeOptions);
}
private List<CurrencyData> currencyOptions;
private List<EnumOptionData> chargeCalculationTypeOptions;
public ChargeData(final Long id, final String name,
final BigDecimal amount, final CurrencyData currency,
final EnumOptionData chargeTimeType,
final EnumOptionData chargeAppliesTo,
final EnumOptionData chargeCalculationType, final boolean active) {
this.id = id;
this.name = name;
this.amount = amount;
this.currency = currency;
this.chargeTimeType = chargeTimeType;
this.chargeAppliesTo = chargeAppliesTo;
this.chargeCalculationType = chargeCalculationType;
this.active = active;
this.currencyOptions = null;
this.chargeCalculationTypeOptions = null;
}
public ChargeData(Long id, String name, BigDecimal amount, String currencyCode, EnumOptionData chargeTimeType,
EnumOptionData chargeAppliesTo, EnumOptionData chargeCalculationType, boolean active) {
this.id = id;
this.name = name;
this.amount = amount;
this.currencyCode = currencyCode;
this.chargeTimeType = chargeTimeType;
this.chargeAppliesTo = chargeAppliesTo;
this.chargeCalculationType = chargeCalculationType;
this.active = active;
}
public ChargeData(final Long id, final String name,
final BigDecimal amount, final CurrencyData currency,
final EnumOptionData chargeTimeType,
final EnumOptionData chargeAppliesTo,
final EnumOptionData chargeCalculationType, final boolean active,
final List<CurrencyData> currencyOptions,
final List<EnumOptionData> chargeCalculationTypeOptions) {
this.id = id;
this.name = name;
this.amount = amount;
this.currency = currency;
this.chargeTimeType = chargeTimeType;
this.chargeAppliesTo = chargeAppliesTo;
this.chargeCalculationType = chargeCalculationType;
this.active = active;
this.currencyOptions = currencyOptions;
this.chargeCalculationTypeOptions = chargeCalculationTypeOptions;
}
public ChargeData(EnumOptionData chargeTimeType, EnumOptionData chargeAppliesTo, List<CurrencyData> currencyOptions, List<EnumOptionData> chargeCalculationTypeOptions) {
this.chargeTimeType = chargeTimeType;
this.chargeAppliesTo = chargeAppliesTo;
this.currencyOptions = currencyOptions;
this.chargeCalculationTypeOptions = chargeCalculationTypeOptions;
}
public Long getId() {
return id;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Long id) {
this.id = id;
}
public boolean isActive() {
return active;
}
public String getName() {
return name;
}
public BigDecimal getAmount() {
return amount;
}
public CurrencyData getCurrency() {
return currency;
}
public void setName(String name) {
this.name = name;
}
public EnumOptionData getChargeTimeType() {
return chargeTimeType;
}
public BigDecimal getAmount() {
return amount;
}
public EnumOptionData getChargeAppliesTo() {
return chargeAppliesTo;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public EnumOptionData getChargeCalculationType() {
return chargeCalculationType;
}
public boolean isActive() {
return active;
}
}
public List<CurrencyData> getCurrencyOptions() {
return currencyOptions;
}
public List<EnumOptionData> getChargeCalculationTypeOptions() {
return chargeCalculationTypeOptions;
}
}
@@ -122,8 +122,8 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ
);
private static final Set<String> CHARGES_DATA_PARAMETERS = new HashSet<String>(
Arrays.asList("id", "name", "amount", "currencyCode", "currencyOptions", "chargeAppliesTo", "chargeTimeType",
"chargeCalculationType", "active")
Arrays.asList("id", "name", "amount", "currency", "active", "chargeAppliesTo", "chargeTimeType",
"chargeCalculationType", "chargeCalculationTypeOptions", "currencyOptions")
);
private final GoogleGsonSerializerHelper helper;
@@ -19,51 +19,47 @@ public class Charge extends AbstractAuditableCustom<AppUser, Long> {
@Column(name = "amount", scale = 6, precision = 19, nullable = false)
private BigDecimal amount;
@Column(name = "currency_code", length=3)
@SuppressWarnings("unused")
@Column(name = "currency_code", length=3)
private String currencyCode;
@Enumerated(EnumType.ORDINAL)
@Column(name = "charge_applies_to_enum", nullable = false)
private ChargeAppliesTo chargeAppliesTo;
@SuppressWarnings("unused")
@Column(name = "charge_applies_to_enum", nullable = false)
private Integer chargeAppliesTo;
@Enumerated(EnumType.ORDINAL)
@Column(name = "charge_time_enum", nullable = false)
private ChargeTimeType chargeTime;
@SuppressWarnings("unused")
@Column(name = "charge_time_enum", nullable = false)
private Integer chargeTime;
@Enumerated(EnumType.ORDINAL)
@Column(name = "charge_calculation_enum")
private ChargeCalculationMethod chargeCalculationMethod;
@SuppressWarnings("unused")
@Column(name = "charge_calculation_enum")
private Integer chargeCalculationMethod;
@Column(name = "is_active", nullable = false)
@SuppressWarnings("unused")
@Column(name = "is_active", nullable = false)
private boolean active;
@Column(name = "is_deleted", nullable=false)
private boolean deleted = false;
public static Charge createNew(String name, BigDecimal amount, String currencyCode, ChargeAppliesTo chargeAppliesTo,
ChargeTimeType chargeTime, ChargeCalculationMethod chargeCalculationMethod, boolean active){
public static Charge createNew(final String name, final BigDecimal amount, final String currencyCode,
final ChargeAppliesTo chargeAppliesTo, final ChargeTimeType chargeTime, final ChargeCalculationMethod chargeCalculationMethod, final boolean active) {
return new Charge(name, amount, currencyCode, chargeAppliesTo, chargeTime, chargeCalculationMethod, active);
}
public Charge() {
this.name = null;
this.amount = null;
this.currencyCode = null;
this.chargeAppliesTo = null;
this.chargeTime = null;
this.chargeCalculationMethod = null;
this.active = false;
protected Charge() {
//
}
public Charge(String name, BigDecimal amount, String currencyCode, ChargeAppliesTo chargeAppliesTo,
ChargeTimeType chargeTime, ChargeCalculationMethod chargeCalculationMethod, boolean active) {
public Charge(final String name, final BigDecimal amount, final String currencyCode,
final ChargeAppliesTo chargeAppliesTo, final ChargeTimeType chargeTime,
final ChargeCalculationMethod chargeCalculationMethod, final boolean active) {
this.name = name;
this.amount = amount;
this.currencyCode = currencyCode;
this.chargeAppliesTo = chargeAppliesTo;
this.chargeTime = chargeTime;
this.chargeCalculationMethod = chargeCalculationMethod;
this.chargeAppliesTo = chargeAppliesTo.getValue();
this.chargeTime = chargeTime.getValue();
this.chargeCalculationMethod = chargeCalculationMethod.getValue();
this.active = active;
}
@@ -93,15 +89,15 @@ public class Charge extends AbstractAuditableCustom<AppUser, Long> {
}
if (command.isChargeTimeTypeChanged()){
this.chargeTime = ChargeTimeType.fromInt(command.getChargeTimeType());
this.chargeTime = ChargeTimeType.fromInt(command.getChargeTimeType()).getValue();
}
if (command.isChargeAppliesToChanged()){
this.chargeAppliesTo = ChargeAppliesTo.fromInt(command.getChargeAppliesTo());
this.chargeAppliesTo = ChargeAppliesTo.fromInt(command.getChargeAppliesTo()).getValue();
}
if (command.isChargeCalculationTypeChanged()){
this.chargeCalculationMethod = ChargeCalculationMethod.fromInt(command.getChargeCalculationType());
this.chargeCalculationMethod = ChargeCalculationMethod.fromInt(command.getChargeCalculationType()).getValue();
}
if (command.isActiveChanged()){
@@ -1,8 +1,9 @@
package org.mifosng.platform.charge.domain;
public enum ChargeAppliesTo {
LOAN(0, "chargeAppliesTo.loan"),
INVALID(1, "chargeAppliesTo.invalid");
INVALID(0, "chargeAppliesTo.invalid"),
LOAN(1, "chargeAppliesTo.loan");
private final Integer value;
private final String code;
@@ -21,9 +22,9 @@ public enum ChargeAppliesTo {
}
public static ChargeAppliesTo fromInt(final Integer chargeAppliesTo){
ChargeAppliesTo chargeAppliesToType = null;
ChargeAppliesTo chargeAppliesToType = ChargeAppliesTo.INVALID;
switch(chargeAppliesTo){
case 0:
case 1:
chargeAppliesToType = LOAN;
break;
default:
@@ -32,4 +33,4 @@ public enum ChargeAppliesTo {
}
return chargeAppliesToType;
}
}
}
@@ -1,12 +1,13 @@
package org.mifosng.platform.charge.domain;
public enum ChargeCalculationMethod {
FLAT(0, "chargeCalculationType.flat"),
PERCENT_OF_AMOUNT(1, "chargeCalculationType.percent.of.amount"),
PERCENT_OF_AMOUNT_AND_INTEREST(2, "chargeCalculationType.percent.of.amount.and.interest"),
PERCENT_OF_INTEREST(3, "chargeCalculationType.percent.of.interest"),
INVALID(4, "chargeCalculationType.invalid");
INVALID(0, "chargeCalculationType.invalid"),
FLAT(1, "chargeCalculationType.flat"),
PERCENT_OF_AMOUNT(2, "chargeCalculationType.percent.of.amount"),
PERCENT_OF_AMOUNT_AND_INTEREST(3, "chargeCalculationType.percent.of.amount.and.interest"),
PERCENT_OF_INTEREST(4, "chargeCalculationType.percent.of.interest");
private final Integer value;
private final String code;
@@ -24,18 +25,18 @@ public enum ChargeCalculationMethod {
}
public static ChargeCalculationMethod fromInt(final Integer chargeCalculation){
ChargeCalculationMethod chargeCalculationMethod = null;
ChargeCalculationMethod chargeCalculationMethod = ChargeCalculationMethod.INVALID;
switch(chargeCalculation){
case 0:
case 1:
chargeCalculationMethod = FLAT;
break;
case 1:
case 2:
chargeCalculationMethod = PERCENT_OF_AMOUNT;
break;
case 2:
case 3:
chargeCalculationMethod = PERCENT_OF_AMOUNT_AND_INTEREST;
break;
case 3:
case 4:
chargeCalculationMethod = PERCENT_OF_INTEREST;
break;
default:
@@ -44,4 +45,4 @@ public enum ChargeCalculationMethod {
}
return chargeCalculationMethod;
}
}
}
@@ -1,8 +1,9 @@
package org.mifosng.platform.charge.domain;
public enum ChargeTimeType {
DISBURSEMENT(0, "chargeTimeType.disbursement"),
INVALID(1, "chargeTimeType.invalid");
INVALID(0, "chargeTimeType.invalid"),
DISBURSEMENT(1, "chargeTimeType.disbursement");
private final Integer value;
private final String code;
@@ -21,9 +22,9 @@ public enum ChargeTimeType {
}
public static ChargeTimeType fromInt(final Integer chargeTime) {
ChargeTimeType chargeTimeType = null;
ChargeTimeType chargeTimeType = ChargeTimeType.INVALID;
switch(chargeTime){
case 0:
case 1:
chargeTimeType = DISBURSEMENT;
break;
default:
@@ -32,4 +33,4 @@ public enum ChargeTimeType {
}
return chargeTimeType;
}
}
}
@@ -24,9 +24,9 @@ public class ChargeCommandValidator {
baseDataValidator.reset().parameter("name").value(command.getName()).notBlank().notExceedingLengthOf(100);
baseDataValidator.reset().parameter("amount").value(command.getAmount()).notNull().positiveAmount();
baseDataValidator.reset().parameter("currencyCode").value(command.getCurrencyCode()).notBlank();
baseDataValidator.reset().parameter("chargeAppliesTo").value(command.getChargeAppliesTo()).notNull().inMinMaxRange(0, 0);
baseDataValidator.reset().parameter("chargeTimeType").value(command.getChargeTimeType()).notNull().inMinMaxRange(0, 0);
baseDataValidator.reset().parameter("chargeCalculationMethod").value(command.getChargeCalculationType()).notNull().inMinMaxRange(0, 3);
baseDataValidator.reset().parameter("chargeAppliesTo").value(command.getChargeAppliesTo()).notNull().inMinMaxRange(1, 1);
baseDataValidator.reset().parameter("chargeTimeType").value(command.getChargeTimeType()).notNull().inMinMaxRange(1, 1);
baseDataValidator.reset().parameter("chargeCalculationType").value(command.getChargeCalculationType()).notNull().inMinMaxRange(1, 4);
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
@@ -42,9 +42,9 @@ public class ChargeCommandValidator {
baseDataValidator.reset().parameter("name").value(command.getName()).ignoreIfNull().notBlank().notExceedingLengthOf(100);
baseDataValidator.reset().parameter("amount").value(command.getAmount()).ignoreIfNull().positiveAmount();
baseDataValidator.reset().parameter("currencyCode").value(command.getCurrencyCode()).ignoreIfNull().notBlank();
baseDataValidator.reset().parameter("chargeAppliesTo").value(command.getChargeAppliesTo()).ignoreIfNull().notNull().inMinMaxRange(0, 0);
baseDataValidator.reset().parameter("chargeTimeType").value(command.getChargeTimeType()).ignoreIfNull().notNull().inMinMaxRange(0, 0);
baseDataValidator.reset().parameter("chargeCalculationMethod").value(command.getChargeCalculationType()).ignoreIfNull().notNull().inMinMaxRange(0, 3);
baseDataValidator.reset().parameter("chargeAppliesTo").value(command.getChargeAppliesTo()).ignoreIfNull().notNull().inMinMaxRange(1, 1);
baseDataValidator.reset().parameter("chargeTimeType").value(command.getChargeTimeType()).ignoreIfNull().notNull().inMinMaxRange(1, 1);
baseDataValidator.reset().parameter("chargeCalculationType").value(command.getChargeCalculationType()).ignoreIfNull().notNull().inMinMaxRange(1, 4);
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
@@ -83,8 +83,9 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
);
EnumOptionData allowedChargeAppliesTo = chargeAppliesTo(ChargeAppliesTo.LOAN);
EnumOptionData allowedChargeTime = chargeTimeType(ChargeTimeType.DISBURSEMENT);
EnumOptionData allowedChargeCalculationType = chargeCalculationType(ChargeCalculationMethod.FLAT);
return new ChargeData(allowedChargeTime, allowedChargeAppliesTo, currencyOptions, allowedChargeCalculationMethods);
return ChargeData.template(allowedChargeTime, allowedChargeAppliesTo, allowedChargeCalculationType, currencyOptions, allowedChargeCalculationMethods);
}
private static final class ChargeMapper implements RowMapper<ChargeData> {
@@ -101,6 +102,7 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
String name = rs.getString("name");
BigDecimal amount = rs.getBigDecimal("amount");
String currencyCode = rs.getString("currencyCode");
CurrencyData currency = new CurrencyData(currencyCode, "", 0, "", "");
int chargeAppliesTo = rs.getInt("chargeAppliesTo");
EnumOptionData chargeAppliesToType = ChargeEnumerations.chargeAppliesTo(chargeAppliesTo);
@@ -113,7 +115,7 @@ public class ChargeReadPlatformServiceImpl implements ChargeReadPlatformService
boolean active = rs.getBoolean("active");
return new ChargeData(id, name, amount, currencyCode, chargeTimeType, chargeAppliesToType, chargeCalculationType, active);
return new ChargeData(id, name, amount, currency, chargeTimeType, chargeAppliesToType, chargeCalculationType, active);
}
}
}