diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm
index 684d181d5..b506c8c10 100644
--- a/api-docs/apiLive.htm
+++ b/api-docs/apiLive.htm
@@ -2854,7 +2854,7 @@ GET https://DomainName/api/v1/clients/template
Optional Fields |
- | groupId, externalId, accountNo, staffId, mobileNo, savingsProductId |
+ groupId, externalId, accountNo, staffId, mobileNo, savingsProductId, genderId, clientTypeId, clientClassificationId |
@@ -29483,6 +29483,14 @@ GET https://DomainName/api/v1/interestratecharts/template
provide a description about the slab.
+
+ | incentives |
+
+
+ |
+ Represents incentives on interest for a perticular period.
+ |
+
@@ -29526,7 +29534,15 @@ Request Body:
"toPeriod": "180",
"annualInterestRate": "5",
"description": "5% interest from 1 day till 180 days of deposit",
- "locale":"en"
+ "locale":"en",
+ "incentives":[{
+ "entityType":"2",
+ "attributeName":2,
+ "conditionType":2,
+ "attributeValue":11,
+ "incentiveType":3,
+ "amount":"-1"
+ }]
}
@@ -29572,7 +29588,15 @@ GET https://DomainName/api/v1/interestratecharts/{chartId}/chartslabs
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
- }
+ },
+ "incentives":[{
+ "id":1,
+ "entityType":{"id":2,"code":"InterestIncentiveEntityType.customer","value":"Customer"},
+ "attributeName":{"id":2,"code":"InterestIncentiveAttributeName.gender","value":"Gender"}, "conditionType":{"id":2,"code":"incentiveConditionType.equal","value":"equal"},
+ "attributeValue":"11","attributeValueDesc":"FEMALE",
+ "incentiveType":{"id":3,"code":"InterestIncentiveType.incentive","value":"Incentive"},
+ "amount":-1.000000
+ }]
}
]
@@ -29612,7 +29636,15 @@ GET https://DomainName/api/v1/interestratecharts/{chartId}/chartslabs/{slabId}
"displaySymbol": "$",
"nameCode": "currency.USD",
"displayLabel": "US Dollar ($)"
- }
+ },
+ "incentives":[{
+ "id":1,
+ "entityType":{"id":2,"code":"InterestIncentiveEntityType.customer","value":"Customer"},
+ "attributeName":{"id":2,"code":"InterestIncentiveAttributeName.gender","value":"Gender"}, "conditionType":{"id":2,"code":"incentiveConditionType.equal","value":"equal"},
+ "attributeValue":"11","attributeValueDesc":"FEMALE",
+ "incentiveType":{"id":3,"code":"InterestIncentiveType.incentive","value":"Incentive"},
+ "amount":-1.000000
+ }]
}
diff --git a/mifosng-db/migrations/core_db/V175__added_incentive_interest_rates.sql b/mifosng-db/migrations/core_db/V175__added_incentive_interest_rates.sql
new file mode 100755
index 000000000..c785d1a1d
--- /dev/null
+++ b/mifosng-db/migrations/core_db/V175__added_incentive_interest_rates.sql
@@ -0,0 +1,49 @@
+ALTER TABLE `m_client`
+ ADD COLUMN `client_type_cv_id` INT(11) NULL DEFAULT NULL AFTER `default_savings_account`,
+ ADD COLUMN `client_classification_cv_id` INT(11) NULL DEFAULT NULL AFTER `client_type_cv_id`,
+ ADD CONSTRAINT `FK_m_client_type_m_code_value` FOREIGN KEY (`client_type_cv_id`) REFERENCES `m_code_value` (`id`),
+ ADD CONSTRAINT `FK_m_client_classification_m_code_value` FOREIGN KEY (`client_classification_cv_id`) REFERENCES `m_code_value` (`id`),
+ ADD CONSTRAINT `FK1_m_client_gender_m_code_value` FOREIGN KEY (`gender_cv_id`) REFERENCES `m_code_value` (`id`);
+
+INSERT INTO `m_code` (`code_name`, `is_system_defined`) VALUES ('ClientType', 1);
+INSERT INTO `m_code` (`code_name`, `is_system_defined`) VALUES ('ClientClassification', 1);
+
+
+CREATE TABLE `m_interest_incentives` (
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+ `interest_rate_slab_id` BIGINT(20) NOT NULL,
+ `entiry_type` SMALLINT(2) NOT NULL,
+ `attribute_name` SMALLINT(2) NOT NULL,
+ `condition_type` SMALLINT(2) NOT NULL,
+ `attribute_value` VARCHAR(50) NOT NULL,
+ `incentive_type` SMALLINT(2) NOT NULL,
+ `amount` DECIMAL(19,6) NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `FK_m_interest_incentives_m_interest_rate_slab` (`interest_rate_slab_id`),
+ CONSTRAINT `FK_m_interest_incentives_m_interest_rate_slab` FOREIGN KEY (`interest_rate_slab_id`) REFERENCES `m_interest_rate_slab` (`id`)
+);
+
+
+CREATE TABLE `m_savings_interest_incentives` (
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
+ `deposit_account_interest_rate_slab_id` BIGINT(20) NOT NULL,
+ `entiry_type` SMALLINT(2) NOT NULL,
+ `attribute_name` SMALLINT(2) NOT NULL,
+ `condition_type` SMALLINT(2) NOT NULL,
+ `attribute_value` VARCHAR(50) NOT NULL,
+ `incentive_type` SMALLINT(2) NOT NULL,
+ `amount` DECIMAL(19,6) NOT NULL,
+ PRIMARY KEY (`id`),
+ INDEX `FK_m_savings_interest_incentives_m_savings_interest_rate_slab` (`deposit_account_interest_rate_slab_id`),
+ CONSTRAINT `FK_m_savings_interest_incentives_m_savings_interest_rate_slab` FOREIGN KEY (`deposit_account_interest_rate_slab_id`) REFERENCES `m_savings_account_interest_rate_slab` (`id`)
+);
+
+ALTER TABLE `m_interest_rate_slab`
+ DROP COLUMN `interest_rate_for_female`,
+ DROP COLUMN `interest_rate_for_children`,
+ DROP COLUMN `interest_rate_for_senior_citizen`;
+
+ALTER TABLE `m_savings_account_interest_rate_slab`
+ DROP COLUMN `interest_rate_for_female`,
+ DROP COLUMN `interest_rate_for_children`,
+ DROP COLUMN `interest_rate_for_senior_citizen`;
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java
index 53cec0aa6..56801d5e4 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/api/JsonCommand.java
@@ -338,6 +338,15 @@ public final class JsonCommand {
return isChanged;
}
+ public boolean isChangeInBigDecimalParameterNamed(final String parameterName, final BigDecimal existingValue, final Locale locale) {
+ boolean isChanged = false;
+ if (parameterExists(parameterName)) {
+ final BigDecimal workingValue = bigDecimalValueOfParameterNamed(parameterName, locale);
+ isChanged = differenceExists(existingValue, workingValue);
+ }
+ return isChanged;
+ }
+
public boolean isChangeInBigDecimalParameterNamedWithNullCheck(final String parameterName, final BigDecimal existingValue) {
boolean isChanged = false;
if (parameterExists(parameterName)) {
@@ -371,6 +380,10 @@ public final class JsonCommand {
return this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(parameterName, this.parsedCommand);
}
+ public BigDecimal bigDecimalValueOfParameterNamed(final String parameterName, final Locale locale) {
+ return this.fromApiJsonHelper.extractBigDecimalNamed(parameterName, this.parsedCommand, locale);
+ }
+
public BigDecimal bigDecimalValueOfParameterNamedDefaultToNullIfZero(final String parameterName) {
return defaultToNullIfZero(bigDecimalValueOfParameterNamed(parameterName));
}
@@ -393,6 +406,15 @@ public final class JsonCommand {
return isChanged;
}
+ public boolean isChangeInIntegerParameterNamed(final String parameterName, final Integer existingValue, final Locale locale) {
+ boolean isChanged = false;
+ if (parameterExists(parameterName)) {
+ final Integer workingValue = integerValueOfParameterNamed(parameterName, locale);
+ isChanged = differenceExists(existingValue, workingValue);
+ }
+ return isChanged;
+ }
+
public boolean isChangeInIntegerParameterNamedWithNullCheck(final String parameterName, final Integer existingValue) {
boolean isChanged = false;
if (parameterExists(parameterName)) {
@@ -410,6 +432,10 @@ public final class JsonCommand {
return this.fromApiJsonHelper.extractIntegerWithLocaleNamed(parameterName, this.parsedCommand);
}
+ public Integer integerValueOfParameterNamed(final String parameterName, final Locale locale) {
+ return this.fromApiJsonHelper.extractIntegerNamed(parameterName, this.parsedCommand, locale);
+ }
+
public Integer integerValueOfParameterNamedDefaultToNullIfZero(final String parameterName) {
return defaultToNullIfZero(integerValueOfParameterNamed(parameterName));
}
@@ -493,5 +519,5 @@ public final class JsonCommand {
public void checkForUnsupportedParameters(final Type typeOfMap, final String json, final Set requestDataParameters) {
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, requestDataParameters);
}
-
+
}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java
index c4e519ccd..f2ec031d8 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/api/ClientApiConstants.java
@@ -16,6 +16,8 @@ public class ClientApiConstants {
public static final String CLIENT_RESOURCE_NAME = "client";
public static final String CLIENT_CLOSURE_REASON = "ClientClosureReason";
public static final String GENDER = "Gender";
+ public static final String CLIENT_TYPE = "ClientType";
+ public static final String CLIENT_CLASSIFICATION = "ClientClassification";
// general
public static final String localeParamName = "locale";
public static final String dateFormatParamName = "dateFormat";
@@ -43,6 +45,10 @@ public class ClientApiConstants {
public static final String dateOfBirthParamName = "dateOfBirth";
public static final String genderIdParamName = "genderId";
public static final String genderParamName = "gender";
+ public static final String clientTypeIdParamName = "clientTypeId";
+ public static final String clientTypeParamName = "clientType";
+ public static final String clientClassificationIdParamName = "clientClassificationId";
+ public static final String clientClassificationParamName = "clientClassification";
// response parameters
public static final String statusParamName = "status";
public static final String hierarchyParamName = "hierarchy";
@@ -67,12 +73,13 @@ public class ClientApiConstants {
public static final Set CLIENT_CREATE_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName,
dateFormatParamName, groupIdParamName, accountNoParamName, externalIdParamName, mobileNoParamName, firstnameParamName,
middlenameParamName, lastnameParamName, fullnameParamName, officeIdParamName, activeParamName, activationDateParamName,
- staffIdParamName, submittedOnDateParamName, savingsProductIdParamName, dateOfBirthParamName, genderIdParamName));
+ staffIdParamName, submittedOnDateParamName, savingsProductIdParamName, dateOfBirthParamName, genderIdParamName,
+ clientTypeIdParamName, clientClassificationIdParamName));
public static final Set CLIENT_UPDATE_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName,
dateFormatParamName, accountNoParamName, externalIdParamName, mobileNoParamName, firstnameParamName, middlenameParamName,
lastnameParamName, fullnameParamName, activeParamName, activationDateParamName, staffIdParamName, savingsProductIdParamName,
- dateOfBirthParamName, genderIdParamName));
+ dateOfBirthParamName, genderIdParamName, clientTypeIdParamName, clientClassificationIdParamName));
/**
* These parameters will match the class level parameters of
@@ -84,7 +91,7 @@ public class ClientApiConstants {
lastnameParamName, fullnameParamName, displayNameParamName, mobileNoParamName, officeIdParamName, officeNameParamName,
transferToOfficeIdParamName, transferToOfficeNameParamName, hierarchyParamName, imageIdParamName, imagePresentParamName,
staffIdParamName, staffNameParamName, timelineParamName, groupsParamName, officeOptionsParamName, staffOptionsParamName,
- dateOfBirthParamName, genderParamName));
+ dateOfBirthParamName, genderParamName,clientTypeParamName,clientClassificationParamName));
public static final Set ACTIVATION_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName,
dateFormatParamName, activationDateParamName));
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientData.java
index 125f7124a..bd92d278a 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientData.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientData.java
@@ -42,6 +42,8 @@ final public class ClientData implements Comparable {
private final String mobileNo;
private final LocalDate dateOfBirth;
private final CodeValueData gender;
+ private final CodeValueData clientType;
+ private final CodeValueData clientClassification;
private final Long officeId;
private final String officeName;
@@ -69,13 +71,18 @@ final public class ClientData implements Comparable {
private final Collection savingProductOptions;
private final Collection savingAccountOptions;
private final Collection genderOptions;
+ private final Collection clientTypeOptions;
+ private final Collection clientClassificationOptions;
public static ClientData template(final Long officeId, final LocalDate joinedDate, final Collection officeOptions,
final Collection staffOptions, final Collection closureReasons,
- final Collection genderOptions, final Collection savingProductOptions) {
+ final Collection genderOptions, final Collection savingProductOptions,
+ final Collection clientTypeOptions, final Collection clientClassificationOptions) {
+ final CodeValueData clientType = null;
+ final CodeValueData clientClassification = null;
return new ClientData(null, null, officeId, null, null, null, null, null, null, null, null, null, null, null, null, null,
- joinedDate, null, null, null, officeOptions, null, staffOptions, closureReasons, genderOptions, null, savingProductOptions, null, null,
- null, null);
+ joinedDate, null, null, null, officeOptions, null, staffOptions, closureReasons, genderOptions, null, savingProductOptions,
+ null, null, null, null, clientType, clientClassification, clientTypeOptions, clientClassificationOptions);
}
@@ -85,9 +92,11 @@ final public class ClientData implements Comparable {
clientData.transferToOfficeId, clientData.transferToOfficeName, clientData.id, clientData.firstname, clientData.middlename,
clientData.lastname, clientData.fullname, clientData.displayName, clientData.externalId, clientData.mobileNo,
clientData.dateOfBirth, clientData.gender, clientData.activationDate, clientData.imageId, clientData.staffId,
- clientData.staffName, templateData.officeOptions, clientData.groups, templateData.staffOptions, templateData.closureReasons, templateData.genderOptions, clientData.timeline,
- templateData.savingProductOptions, clientData.savingsProductId, clientData.savingsProductName, clientData.savingsAccountId,
- clientData.savingAccountOptions);
+ clientData.staffName, templateData.officeOptions, clientData.groups, templateData.staffOptions,
+ templateData.closureReasons, templateData.genderOptions, clientData.timeline, templateData.savingProductOptions,
+ clientData.savingsProductId, clientData.savingsProductName, clientData.savingsAccountId, clientData.savingAccountOptions,
+ clientData.clientType, clientData.clientClassification, templateData.clientTypeOptions,
+ templateData.clientClassificationOptions);
}
@@ -98,9 +107,10 @@ final public class ClientData implements Comparable {
clientData.transferToOfficeId, clientData.transferToOfficeName, clientData.id, clientData.firstname, clientData.middlename,
clientData.lastname, clientData.fullname, clientData.displayName, clientData.externalId, clientData.mobileNo,
clientData.dateOfBirth, clientData.gender, clientData.activationDate, clientData.imageId, clientData.staffId,
- clientData.staffName, clientData.officeOptions, clientData.groups, clientData.staffOptions, null, null, null,
- clientData.savingProductOptions, clientData.savingsProductId, clientData.savingsProductName, clientData.savingsAccountId,
- savingAccountOptions);
+ clientData.staffName, clientData.officeOptions, clientData.groups, clientData.staffOptions, clientData.closureReasons,
+ clientData.genderOptions, clientData.timeline, clientData.savingProductOptions, clientData.savingsProductId,
+ clientData.savingsProductName, clientData.savingsAccountId, savingAccountOptions, clientData.clientType,
+ clientData.clientClassification, clientData.clientTypeOptions, clientData.clientClassificationOptions);
}
@@ -111,22 +121,32 @@ final public class ClientData implements Comparable {
clientData.dateOfBirth, clientData.gender, clientData.activationDate, clientData.imageId, clientData.staffId,
clientData.staffName, clientData.officeOptions, parentGroups, clientData.staffOptions, null, null, clientData.timeline,
clientData.savingProductOptions, clientData.savingsProductId, clientData.savingsProductName, clientData.savingsAccountId,
- clientData.savingAccountOptions);
+ clientData.savingAccountOptions, clientData.clientType, clientData.clientClassification, clientData.clientTypeOptions,
+ clientData.clientClassificationOptions);
}
public static ClientData clientIdentifier(final Long id, final String accountNo, final EnumOptionData status, final String firstname,
final String middlename, final String lastname, final String fullname, final String displayName, final Long officeId,
final String officeName) {
-
+ final CodeValueData clientType = null;
+ final CodeValueData clientClassification = null;
+ final Collection clientTypeOptions = null;
+ final Collection clientClassificationOptions = null;
return new ClientData(accountNo, status, officeId, officeName, null, null, id, firstname, middlename, lastname, fullname,
- displayName, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
+ displayName, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+ null, clientType, clientClassification, clientTypeOptions, clientClassificationOptions);
}
public static ClientData lookup(final Long id, final String displayName, final Long officeId, final String officeName) {
+ final CodeValueData clientType = null;
+ final CodeValueData clientClassification = null;
+ final Collection clientTypeOptions = null;
+ final Collection clientClassificationOptions = null;
return new ClientData(null, null, officeId, officeName, null, null, id, null, null, null, null, displayName, null, null, null,
- null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
+ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, clientType,
+ clientClassification, clientTypeOptions, clientClassificationOptions);
}
@@ -135,10 +155,14 @@ final public class ClientData implements Comparable {
final String middlename, final String lastname, final String fullname, final String displayName, final String externalId,
final String mobileNo, final LocalDate dateOfBirth, final CodeValueData gender, final LocalDate activationDate,
final Long imageId, final Long staffId, final String staffName, final ClientTimelineData timeline, final Long savingsProductId,
- final String savingsProductName, final Long savingsAccountId) {
+ final String savingsProductName, final Long savingsAccountId, final CodeValueData clientType,
+ final CodeValueData clientClassification) {
+ final Collection clientTypeOptions = null;
+ final Collection clientClassificationOptions = null;
return new ClientData(accountNo, status, officeId, officeName, transferToOfficeId, transferToOfficeName, id, firstname, middlename,
lastname, fullname, displayName, externalId, mobileNo, dateOfBirth, gender, activationDate, imageId, staffId, staffName,
- null, null, null, null, null, timeline, null, savingsProductId, savingsProductName, savingsAccountId, null);
+ null, null, null, null, null, timeline, null, savingsProductId, savingsProductName, savingsAccountId, null, clientType,
+ clientClassification, clientTypeOptions, clientClassificationOptions);
}
@@ -148,9 +172,11 @@ final public class ClientData implements Comparable {
final String mobileNo, final LocalDate dateOfBirth, final CodeValueData gender, final LocalDate activationDate,
final Long imageId, final Long staffId, final String staffName, final Collection allowedOffices,
final Collection groups, final Collection staffOptions,
- final Collection closureReasons, final Collection genderOptions, final ClientTimelineData timeline,
- final Collection savingProductOptions, final Long savingsProductId, final String savingsProductName,
- final Long savingsAccountId, final Collection savingAccountOptions) {
+ final Collection closureReasons, final Collection genderOptions,
+ final ClientTimelineData timeline, final Collection savingProductOptions, final Long savingsProductId,
+ final String savingsProductName, final Long savingsAccountId, final Collection savingAccountOptions,
+ final CodeValueData clientType, final CodeValueData clientClassification, final Collection clientTypeOptions,
+ final Collection clientClassificationOptions) {
this.accountNo = accountNo;
this.status = status;
if (status != null) {
@@ -173,6 +199,8 @@ final public class ClientData implements Comparable {
this.activationDate = activationDate;
this.dateOfBirth = dateOfBirth;
this.gender = gender;
+ this.clientClassification = clientClassification;
+ this.clientType = clientType;
this.imageId = imageId;
if (imageId != null) {
this.imagePresent = Boolean.TRUE;
@@ -190,6 +218,8 @@ final public class ClientData implements Comparable {
this.staffOptions = staffOptions;
this.closureReasons = closureReasons;
this.genderOptions = genderOptions;
+ this.clientClassificationOptions = clientClassificationOptions;
+ this.clientTypeOptions = clientTypeOptions;
this.timeline = timeline;
this.savingProductOptions = savingProductOptions;
@@ -197,6 +227,7 @@ final public class ClientData implements Comparable {
this.savingsProductName = savingsProductName;
this.savingsAccountId = savingsAccountId;
this.savingAccountOptions = savingAccountOptions;
+
}
public Long id() {
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java
index 5ac2c2e0a..c154294c3 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/data/ClientDataValidator.java
@@ -153,9 +153,21 @@ public final class ClientDataValidator {
if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.genderIdParamName, element)) {
final Integer genderId = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(ClientApiConstants.genderIdParamName, element);
- baseDataValidator.reset().parameter(ClientApiConstants.genderIdParamName).value(genderId).notNull();
+ baseDataValidator.reset().parameter(ClientApiConstants.genderIdParamName).value(genderId).integerGreaterThanZero();
}
+ if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.clientTypeIdParamName, element)) {
+ final Integer clientType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(ClientApiConstants.clientTypeIdParamName,
+ element);
+ baseDataValidator.reset().parameter(ClientApiConstants.clientTypeIdParamName).value(clientType).integerGreaterThanZero();
+ }
+
+ if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.clientClassificationIdParamName, element)) {
+ final Integer clientClassification = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(
+ ClientApiConstants.clientClassificationIdParamName, element);
+ baseDataValidator.reset().parameter(ClientApiConstants.clientClassificationIdParamName).value(clientClassification)
+ .integerGreaterThanZero();
+ }
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
@@ -338,7 +350,20 @@ public final class ClientDataValidator {
if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.genderIdParamName, element)) {
final Integer genderId = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(ClientApiConstants.genderIdParamName, element);
- baseDataValidator.reset().parameter(ClientApiConstants.genderIdParamName).value(genderId).notNull();
+ baseDataValidator.reset().parameter(ClientApiConstants.genderIdParamName).value(genderId).integerGreaterThanZero();
+ }
+
+ if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.clientTypeIdParamName, element)) {
+ final Integer clientType = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(ClientApiConstants.clientTypeIdParamName,
+ element);
+ baseDataValidator.reset().parameter(ClientApiConstants.clientTypeIdParamName).value(clientType).integerGreaterThanZero();
+ }
+
+ if (this.fromApiJsonHelper.parameterExists(ClientApiConstants.clientClassificationIdParamName, element)) {
+ final Integer clientClassification = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(
+ ClientApiConstants.clientClassificationIdParamName, element);
+ baseDataValidator.reset().parameter(ClientApiConstants.clientClassificationIdParamName).value(clientClassification)
+ .integerGreaterThanZero();
}
if (!atLeastOneParameterPassedForUpdate) {
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/Client.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/Client.java
index e089fe407..9ab4cf1c5 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/Client.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/Client.java
@@ -46,7 +46,6 @@ import org.mifosplatform.organisation.office.domain.Office;
import org.mifosplatform.organisation.staff.domain.Staff;
import org.mifosplatform.portfolio.client.api.ClientApiConstants;
import org.mifosplatform.portfolio.group.domain.Group;
-import org.mifosplatform.portfolio.interestratechart.data.ClientIncentiveAttributes;
import org.mifosplatform.portfolio.savings.domain.SavingsAccount;
import org.mifosplatform.portfolio.savings.domain.SavingsProduct;
import org.mifosplatform.useradministration.domain.AppUser;
@@ -159,11 +158,17 @@ public final class Client extends AbstractPersistable {
@JoinColumn(name = "default_savings_account", nullable = true)
private SavingsAccount savingsAccount;
- @Transient
- private ClientIncentiveAttributes incentiveAttributes;
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "client_type_cv_id", nullable = true)
+ private CodeValue clientType;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "client_classification_cv_id", nullable = true)
+ private CodeValue clientClassification;
public static Client createNew(final AppUser currentUser, final Office clientOffice, final Group clientParentGroup, final Staff staff,
- final SavingsProduct savingsProduct, final CodeValue gender, final JsonCommand command) {
+ final SavingsProduct savingsProduct, final CodeValue gender, final CodeValue clientType, final CodeValue clientClassification,
+ final JsonCommand command) {
final String accountNo = command.stringValueOfParameterNamed(ClientApiConstants.accountNoParamName);
final String externalId = command.stringValueOfParameterNamed(ClientApiConstants.externalIdParamName);
@@ -200,7 +205,7 @@ public final class Client extends AbstractPersistable {
final SavingsAccount account = null;
return new Client(currentUser, status, clientOffice, clientParentGroup, accountNo, firstname, middlename, lastname, fullname,
activationDate, officeJoiningDate, externalId, mobileNo, staff, submittedOnDate, savingsProduct, account, dataOfBirth,
- gender);
+ gender, clientType, clientClassification);
}
protected Client() {
@@ -211,7 +216,7 @@ public final class Client extends AbstractPersistable {
final String accountNo, final String firstname, final String middlename, final String lastname, final String fullname,
final LocalDate activationDate, final LocalDate officeJoiningDate, final String externalId, final String mobileNo,
final Staff staff, final LocalDate submittedOnDate, final SavingsProduct savingsProduct, final SavingsAccount savingsAccount,
- final LocalDate dateOfBirth, final CodeValue gender) {
+ final LocalDate dateOfBirth, final CodeValue gender, final CodeValue clientType, final CodeValue clientClassification) {
if (StringUtils.isBlank(accountNo)) {
this.accountNumber = new RandomPasswordGenerator(19).generate();
@@ -283,6 +288,8 @@ public final class Client extends AbstractPersistable {
if (dateOfBirth != null) {
this.dateOfBirth = dateOfBirth.toDateTimeAtStartOfDay().toDate();
}
+ this.clientType = clientType;
+ this.clientClassification = clientClassification;
deriveDisplayName();
validate();
@@ -429,7 +436,7 @@ public final class Client extends AbstractPersistable {
final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.staffIdParamName);
actualChanges.put(ClientApiConstants.staffIdParamName, newValue);
}
-
+
if (command.isChangeInLongParameterNamed(ClientApiConstants.genderIdParamName, genderId())) {
final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.genderIdParamName);
actualChanges.put(ClientApiConstants.genderIdParamName, newValue);
@@ -440,6 +447,21 @@ public final class Client extends AbstractPersistable {
actualChanges.put(ClientApiConstants.savingsProductIdParamName, newValue);
}
+ if (command.isChangeInLongParameterNamed(ClientApiConstants.genderIdParamName, genderId())) {
+ final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.genderIdParamName);
+ actualChanges.put(ClientApiConstants.genderIdParamName, newValue);
+ }
+
+ if (command.isChangeInLongParameterNamed(ClientApiConstants.clientTypeIdParamName, clientTypeId())) {
+ final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.clientTypeIdParamName);
+ actualChanges.put(ClientApiConstants.clientTypeIdParamName, newValue);
+ }
+
+ if (command.isChangeInLongParameterNamed(ClientApiConstants.clientClassificationIdParamName, clientClassificationId())) {
+ final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.clientClassificationIdParamName);
+ actualChanges.put(ClientApiConstants.clientClassificationIdParamName, newValue);
+ }
+
final String dateFormatAsInput = command.dateFormat();
final String localeAsInput = command.locale();
@@ -703,10 +725,6 @@ public final class Client extends AbstractPersistable {
this.savingsAccount = savingsAccount;
}
- public ClientIncentiveAttributes incentiveAttributes() {
- return this.incentiveAttributes;
- }
-
public void updateIncentiveAttributes(final Long ageLimitForChildren, final Long ageLimitForSeniorCitizen, final LocalDate compareOnDate) {
boolean isFemale = false;
boolean isChild = false;
@@ -722,7 +740,7 @@ public final class Client extends AbstractPersistable {
if (this.dateOfBirth != null) {
final LocalDate dobLacalDate = LocalDate.fromDateFields(this.dateOfBirth);
final int age = Years.yearsBetween(dobLacalDate, compareOnDate).getYears();
-
+
if (age >= ageLimitForSeniorCitizen.intValue()) {
isSeniorCitizen = true;
}
@@ -732,15 +750,9 @@ public final class Client extends AbstractPersistable {
}
}
- this.incentiveAttributes = ClientIncentiveAttributes.instance(isFemale, isChild, isSeniorCitizen);
-
}
- public CodeValue gender() {
- return this.gender;
- }
-
- private Long genderId() {
+ public Long genderId() {
Long genderId = null;
if (this.gender != null) {
genderId = this.gender.getId();
@@ -748,7 +760,47 @@ public final class Client extends AbstractPersistable {
return genderId;
}
- public void updateGender(final CodeValue gender) {
+ public Long clientTypeId() {
+ Long clientTypeId = null;
+ if (this.clientType != null) {
+ clientTypeId = this.clientType.getId();
+ }
+ return clientTypeId;
+ }
+
+ public Long clientClassificationId() {
+ Long clientClassificationId = null;
+ if (this.clientClassification != null) {
+ clientClassificationId = this.clientClassification.getId();
+ }
+ return clientClassificationId;
+ }
+
+ public CodeValue gender() {
+ return this.gender;
+ }
+
+ public CodeValue clientType() {
+ return this.clientType;
+ }
+
+ public void updateClientType(CodeValue clientType) {
+ this.clientType = clientType;
+ }
+
+ public CodeValue clientClassification() {
+ return this.clientClassification;
+ }
+
+ public void updateClientClassification(CodeValue clientClassification) {
+ this.clientClassification = clientClassification;
+ }
+
+ public void updateGender(CodeValue gender) {
this.gender = gender;
}
+
+ public Date dateOfBirth() {
+ return this.dateOfBirth;
+ }
}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java
index b22b672c0..9648bd8de 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java
@@ -98,7 +98,14 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
final List genderOptions = new ArrayList(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.GENDER));
- return ClientData.template(defaultOfficeId, new LocalDate(), offices, staffOptions, null, genderOptions, savingsProductDatas);
+ final List clientTypeOptions = new ArrayList(
+ this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.CLIENT_TYPE));
+
+ final List clientClassificationOptions = new ArrayList(
+ this.codeValueReadPlatformService.retrieveCodeValuesByCode(ClientApiConstants.CLIENT_CLASSIFICATION));
+
+ return ClientData.template(defaultOfficeId, new LocalDate(), offices, staffOptions, null, genderOptions, savingsProductDatas,
+ clientTypeOptions, clientClassificationOptions);
}
@Override
@@ -276,6 +283,10 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
sqlBuilder.append("c.date_of_birth as dateOfBirth, ");
sqlBuilder.append("c.gender_cv_id as genderId, ");
sqlBuilder.append("cv.code_value as genderValue, ");
+ sqlBuilder.append("c.client_type_cv_id as clienttypeId, ");
+ sqlBuilder.append("cvclienttype.code_value as clienttypeValue, ");
+ sqlBuilder.append("c.client_classification_cv_id as classificationId, ");
+ sqlBuilder.append("cvclassification.code_value as classificationValue, ");
sqlBuilder.append("c.activation_date as activationDate, c.image_id as imageId, ");
sqlBuilder.append("c.staff_id as staffId, s.display_name as staffName,");
sqlBuilder.append("c.default_savings_product as savingsProductId, sp.name as savingsProductName, ");
@@ -306,6 +317,8 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
sqlBuilder.append("left join m_appuser acu on acu.id = c.activatedon_userid ");
sqlBuilder.append("left join m_appuser clu on clu.id = c.closedon_userid ");
sqlBuilder.append("left join m_code_value cv on cv.id = c.gender_cv_id ");
+ sqlBuilder.append("left join m_code_value cvclienttype on cvclienttype.id = c.client_type_cv_id ");
+ sqlBuilder.append("left join m_code_value cvclassification on cvclassification.id = c.client_classification_cv_id ");
this.schema = sqlBuilder.toString();
}
@@ -341,6 +354,14 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
final String genderValue = rs.getString("genderValue");
final CodeValueData gender = CodeValueData.instance(genderId, genderValue);
+ final Long clienttypeId = JdbcSupport.getLong(rs, "clienttypeId");
+ final String clienttypeValue = rs.getString("clienttypeValue");
+ final CodeValueData clienttype = CodeValueData.instance(clienttypeId, clienttypeValue);
+
+ final Long classificationId = JdbcSupport.getLong(rs, "classificationId");
+ final String classificationValue = rs.getString("classificationValue");
+ final CodeValueData classification = CodeValueData.instance(classificationId, classificationValue);
+
final LocalDate activationDate = JdbcSupport.getLocalDate(rs, "activationDate");
final Long imageId = JdbcSupport.getLong(rs, "imageId");
final Long staffId = JdbcSupport.getLong(rs, "staffId");
@@ -371,7 +392,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
return ClientData.instance(accountNo, status, officeId, officeName, transferToOfficeId, transferToOfficeName, id, firstname,
middlename, lastname, fullname, displayName, externalId, mobileNo, dateOfBirth, gender, activationDate, imageId,
- staffId, staffName, timeline, savingsProductId, savingsProductName, savingsAccountId);
+ staffId, staffName, timeline, savingsProductId, savingsProductName, savingsAccountId, clienttype, classification);
}
}
@@ -407,6 +428,10 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
builder.append("c.date_of_birth as dateOfBirth, ");
builder.append("c.gender_cv_id as genderId, ");
builder.append("cv.code_value as genderValue, ");
+ builder.append("c.client_type_cv_id as clienttypeId, ");
+ builder.append("cvclienttype.code_value as clienttypeValue, ");
+ builder.append("c.client_classification_cv_id as classificationId, ");
+ builder.append("cvclassification.code_value as classificationValue, ");
builder.append("c.submittedon_date as submittedOnDate, ");
builder.append("sbu.username as submittedByUsername, ");
@@ -436,6 +461,8 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
builder.append("left join m_appuser acu on acu.id = c.activatedon_userid ");
builder.append("left join m_appuser clu on clu.id = c.closedon_userid ");
builder.append("left join m_code_value cv on cv.id = c.gender_cv_id ");
+ builder.append("left join m_code_value cvclienttype on cvclienttype.id = c.client_type_cv_id ");
+ builder.append("left join m_code_value cvclassification on cvclassification.id = c.client_classification_cv_id ");
this.schema = builder.toString();
}
@@ -470,6 +497,15 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
final Long genderId = JdbcSupport.getLong(rs, "genderId");
final String genderValue = rs.getString("genderValue");
final CodeValueData gender = CodeValueData.instance(genderId, genderValue);
+
+ final Long clienttypeId = JdbcSupport.getLong(rs, "clienttypeId");
+ final String clienttypeValue = rs.getString("clienttypeValue");
+ final CodeValueData clienttype = CodeValueData.instance(clienttypeId, clienttypeValue);
+
+ final Long classificationId = JdbcSupport.getLong(rs, "classificationId");
+ final String classificationValue = rs.getString("classificationValue");
+ final CodeValueData classification = CodeValueData.instance(classificationId, classificationValue);
+
final LocalDate activationDate = JdbcSupport.getLocalDate(rs, "activationDate");
final Long imageId = JdbcSupport.getLong(rs, "imageId");
final Long staffId = JdbcSupport.getLong(rs, "staffId");
@@ -499,7 +535,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
return ClientData.instance(accountNo, status, officeId, officeName, transferToOfficeId, transferToOfficeName, id, firstname,
middlename, lastname, fullname, displayName, externalId, mobileNo, dateOfBirth, gender, activationDate, imageId,
- staffId, staffName, timeline, savingsProductId, savingsProductName, savingsAccountId);
+ staffId, staffName, timeline, savingsProductId, savingsProductName, savingsAccountId, clienttype, classification);
}
}
@@ -611,8 +647,9 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
public ClientData retrieveAllClosureReasons(final String clientClosureReason) {
final List closureReasons = new ArrayList(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(clientClosureReason));
-
- return ClientData.template(null, null, null, null, closureReasons, null, null);
+ final Collection clientTypeOptions = null;
+ final Collection clientClassificationOptions = null;
+ return ClientData.template(null, null, null, null, closureReasons, null, null, clientTypeOptions, clientClassificationOptions);
}
}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java
index 901a4c6a3..a6832e786 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java
@@ -189,6 +189,20 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
gender = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection(ClientApiConstants.GENDER, genderId);
}
+ CodeValue clientType = null;
+ final Long clientTypeId = command.longValueOfParameterNamed(ClientApiConstants.clientTypeIdParamName);
+ if (clientTypeId != null) {
+ clientType = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection(ClientApiConstants.CLIENT_TYPE,
+ clientTypeId);
+ }
+
+ CodeValue clientClassification = null;
+ final Long clientClassificationId = command.longValueOfParameterNamed(ClientApiConstants.clientClassificationIdParamName);
+ if (clientClassificationId != null) {
+ clientClassification = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection(
+ ClientApiConstants.CLIENT_CLASSIFICATION, clientClassificationId);
+ }
+
SavingsProduct savingsProduct = null;
final Long savingsProductId = command.longValueOfParameterNamed(ClientApiConstants.savingsProductIdParamName);
if (savingsProductId != null) {
@@ -197,7 +211,8 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
}
- final Client newClient = Client.createNew(currentUser, clientOffice, clientParentGroup, staff, savingsProduct, gender, command);
+ final Client newClient = Client.createNew(currentUser, clientOffice, clientParentGroup, staff, savingsProduct, gender,
+ clientType, clientClassification, command);
boolean rollbackTransaction = false;
if (newClient.isActive()) {
final CommandWrapper commandWrapper = new CommandWrapperBuilder().activateClient(null).build();
@@ -283,6 +298,35 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
clientForUpdate.updateSavingsProduct(savingsProduct);
}
+ if (changes.containsKey(ClientApiConstants.genderIdParamName)) {
+ final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.genderIdParamName);
+ CodeValue newCodeVal = null;
+ if (newValue != null) {
+ newCodeVal = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection(ClientApiConstants.GENDER, newValue);
+ }
+ clientForUpdate.updateGender(newCodeVal);
+ }
+
+ if (changes.containsKey(ClientApiConstants.clientTypeIdParamName)) {
+ final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.clientTypeIdParamName);
+ CodeValue newCodeVal = null;
+ if (newValue != null) {
+ newCodeVal = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection(ClientApiConstants.CLIENT_TYPE,
+ newValue);
+ }
+ clientForUpdate.updateClientType(newCodeVal);
+ }
+
+ if (changes.containsKey(ClientApiConstants.clientClassificationIdParamName)) {
+ final Long newValue = command.longValueOfParameterNamed(ClientApiConstants.clientClassificationIdParamName);
+ CodeValue newCodeVal = null;
+ if (newValue != null) {
+ newCodeVal = this.codeValueRepository.findOneByCodeNameAndIdWithNotFoundDetection(
+ ClientApiConstants.CLIENT_CLASSIFICATION, newValue);
+ }
+ clientForUpdate.updateClientClassification(newCodeVal);
+ }
+
if (!changes.isEmpty()) {
this.clientRepository.saveAndFlush(clientForUpdate);
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/ConditionType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/ConditionType.java
new file mode 100755
index 000000000..a138641c0
--- /dev/null
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/domain/ConditionType.java
@@ -0,0 +1,84 @@
+/**
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.mifosplatform.portfolio.common.domain;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public enum ConditionType {
+
+ INVALID(0, "ConditionType.invalid"), //
+ LESSTHAN(1, "ConditionType.lessthan"), //
+ EQUAL(2, "ConditionType.equal"), //
+ GRETERTHAN(3, "ConditionType.greterthan"), //
+ NOT_EQUAL(4, "ConditionType.notequal");//
+
+ private final Integer value;
+ private final String code;
+
+ private static final Map intToEnumMap = new HashMap();
+ static {
+ for (final ConditionType type : ConditionType.values()) {
+ intToEnumMap.put(type.value, type);
+ }
+ }
+
+ public static ConditionType fromInt(final Integer ruleTypeValue) {
+ final ConditionType type = intToEnumMap.get(ruleTypeValue);
+ return type;
+ }
+
+ private ConditionType(final Integer value, final String code) {
+ this.value = value;
+ this.code = code;
+ }
+
+ @Override
+ public String toString() {
+ return name().toString().replaceAll("_", " ");
+ }
+
+ public Integer getValue() {
+ return this.value;
+ }
+
+ public String getCode() {
+ return this.code;
+ }
+
+ public boolean isConditionTypeEqual() {
+ return ConditionType.EQUAL.getValue().equals(this.value);
+ }
+
+ public boolean isConditionTypeGreterThan() {
+ return ConditionType.GRETERTHAN.getValue().equals(this.value);
+ }
+
+ public boolean isConditionTypeNotEqual() {
+ return ConditionType.NOT_EQUAL.getValue().equals(this.value);
+ }
+
+ public boolean isConditionTypeLessThan() {
+ return ConditionType.LESSTHAN.getValue().equals(this.value);
+ }
+
+ public boolean isInvalid() {
+ return ConditionType.INVALID.getValue().equals(this.value);
+ }
+
+ public static Object[] integerValues() {
+ final List values = new ArrayList();
+ for (final ConditionType enumType : values()) {
+ if (!enumType.isInvalid()) {
+ values.add(enumType.getValue());
+ }
+ }
+
+ return values.toArray();
+ }
+}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/CommonEnumerations.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/CommonEnumerations.java
index b10966fb1..f75d362ad 100755
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/CommonEnumerations.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/CommonEnumerations.java
@@ -1,6 +1,10 @@
package org.mifosplatform.portfolio.common.service;
+import java.util.ArrayList;
+import java.util.List;
+
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
+import org.mifosplatform.portfolio.common.domain.ConditionType;
import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType;
public class CommonEnumerations {
@@ -36,4 +40,44 @@ public class CommonEnumerations {
return optionData;
}
+ public static EnumOptionData conditionType(final int id, final String codePrefix) {
+ return conditionType(ConditionType.fromInt(id), codePrefix);
+ }
+
+ public static EnumOptionData conditionType(final ConditionType type, final String codePrefix) {
+ EnumOptionData optionData = null;
+ switch (type) {
+ case EQUAL:
+ optionData = new EnumOptionData(ConditionType.EQUAL.getValue().longValue(), codePrefix + ConditionType.EQUAL.getCode(),
+ "equal");
+ break;
+ case NOT_EQUAL:
+ optionData = new EnumOptionData(ConditionType.NOT_EQUAL.getValue().longValue(), codePrefix
+ + ConditionType.NOT_EQUAL.getCode(), "notEqual");
+ break;
+ case GRETERTHAN:
+ optionData = new EnumOptionData(ConditionType.GRETERTHAN.getValue().longValue(), codePrefix
+ + ConditionType.GRETERTHAN.getCode(), "greterthan");
+ break;
+ case LESSTHAN:
+ optionData = new EnumOptionData(ConditionType.LESSTHAN.getValue().longValue(), codePrefix
+ + ConditionType.LESSTHAN.getCode(), "lessthan");
+ break;
+ default:
+ optionData = new EnumOptionData(ConditionType.INVALID.getValue().longValue(), ConditionType.INVALID.getCode(), "Invalid");
+ break;
+ }
+ return optionData;
+ }
+
+ public static List conditionType(final ConditionType[] conditionTypes, final String codePrefix) {
+ final List optionDatas = new ArrayList();
+ for (final ConditionType conditionType : conditionTypes) {
+ if (!conditionType.isInvalid()) {
+ optionDatas.add(conditionType(conditionType, codePrefix));
+ }
+ }
+ return optionDatas;
+ }
+
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformService.java
index 7e96ad23a..f5fafda2c 100755
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformService.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformService.java
@@ -8,4 +8,6 @@ import org.mifosplatform.infrastructure.core.data.EnumOptionData;
public interface DropdownReadPlatformService {
List retrievePeriodFrequencyTypeOptions();
+
+ List retrieveConditionTypeOptions();
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformServiceImpl.java
index 43eca29c1..d85a5b3cf 100755
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformServiceImpl.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/common/service/DropdownReadPlatformServiceImpl.java
@@ -1,11 +1,13 @@
package org.mifosplatform.portfolio.common.service;
+import static org.mifosplatform.portfolio.common.service.CommonEnumerations.conditionType;
import static org.mifosplatform.portfolio.common.service.CommonEnumerations.termFrequencyType;
import java.util.Arrays;
import java.util.List;
import org.mifosplatform.infrastructure.core.data.EnumOptionData;
+import org.mifosplatform.portfolio.common.domain.ConditionType;
import org.mifosplatform.portfolio.common.domain.PeriodFrequencyType;
import org.springframework.stereotype.Service;
@@ -20,4 +22,12 @@ public class DropdownReadPlatformServiceImpl implements DropdownReadPlatformServ
return loanTermFrequencyOptions;
}
+ @Override
+ public List retrieveConditionTypeOptions() {
+ final List loanTermFrequencyOptions = Arrays.asList(conditionType(ConditionType.EQUAL, "condition"),
+ conditionType(ConditionType.NOT_EQUAL, "condition"), conditionType(ConditionType.GRETERTHAN, "condition"),
+ conditionType(ConditionType.LESSTHAN, "condition"));
+ return loanTermFrequencyOptions;
+ }
+
}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/InterestIncentiveApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/InterestIncentiveApiConstants.java
new file mode 100755
index 000000000..ce93deaae
--- /dev/null
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/InterestIncentiveApiConstants.java
@@ -0,0 +1,32 @@
+package org.mifosplatform.portfolio.interestratechart;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public interface InterestIncentiveApiConstants {
+
+ public static final String idParamName = "id";
+ public static final String entityTypeParamName = "entityType";
+ public static final String attributeNameParamName = "attributeName";
+ public static final String conditionTypeParamName = "conditionType";
+ public static final String attributeValueParamName = "attributeValue";
+ public static final String incentiveTypeparamName = "incentiveType";
+ public static final String amountParamName = "amount";
+ public static final String deleteParamName = "delete";
+
+ public static final String INCENTIVE_RESOURCE_NAME = "interest.rate.incentives";
+
+ public static final Set INTERESTRATE_INCENTIVE_CREATE_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(idParamName,
+ entityTypeParamName, attributeNameParamName, conditionTypeParamName, attributeValueParamName, incentiveTypeparamName,
+ amountParamName));
+
+ public static final Set INTERESTRATE_INCENTIVE_UPDATE_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(idParamName,
+ entityTypeParamName, attributeNameParamName, conditionTypeParamName, attributeValueParamName, incentiveTypeparamName,
+ amountParamName));
+
+ public static final Set INTERESTRATE_INCENTIVE_RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList(idParamName,
+ entityTypeParamName, attributeNameParamName, conditionTypeParamName, attributeValueParamName, incentiveTypeparamName,
+ amountParamName));
+
+}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/InterestRateChartSlabApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/InterestRateChartSlabApiConstants.java
index f3e16be6f..7c31826ab 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/InterestRateChartSlabApiConstants.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/InterestRateChartSlabApiConstants.java
@@ -30,25 +30,20 @@ public class InterestRateChartSlabApiConstants {
public static final String amountRangeFromParamName = "amountRangeFrom";
public static final String amountRangeToParamName = "amountRangeTo";
public static final String annualInterestRateParamName = "annualInterestRate";
- public static final String interestRateForFemaleParamName = "interestRateForFemale";
- public static final String interestRateForChildrenParamName = "interestRateForChildren";
- public static final String interestRateForSeniorCitizenParamName = "interestRateForSeniorCitizen";
public static final String currencyCodeParamName = "currencyCode";
+ public static final String incentivesParamName = "incentives";
// associations
public static final Set INTERESTRATE_CHART_SLAB_CREATE_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(
localeParamName, idParamName, descriptionParamName, periodTypeParamName, fromPeriodParamName, toPeriodParamName,
- amountRangeFromParamName, amountRangeToParamName, annualInterestRateParamName, interestRateForFemaleParamName,
- interestRateForChildrenParamName, interestRateForSeniorCitizenParamName, currencyCodeParamName));
+ amountRangeFromParamName, amountRangeToParamName, annualInterestRateParamName, currencyCodeParamName, incentivesParamName));
public static final Set INTERESTRATE_CHART_SLAB_UPDATE_REQUEST_DATA_PARAMETERS = new HashSet(Arrays.asList(
localeParamName, idParamName, descriptionParamName, periodTypeParamName, fromPeriodParamName, toPeriodParamName,
- amountRangeFromParamName, amountRangeToParamName, annualInterestRateParamName, interestRateForFemaleParamName,
- interestRateForChildrenParamName, interestRateForSeniorCitizenParamName, currencyCodeParamName));
+ amountRangeFromParamName, amountRangeToParamName, annualInterestRateParamName, currencyCodeParamName, incentivesParamName));
public static final Set INTERESTRATE_CHART_SLAB_RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList(localeParamName,
idParamName, descriptionParamName, periodTypeParamName, fromPeriodParamName, toPeriodParamName, amountRangeFromParamName,
- amountRangeToParamName, annualInterestRateParamName, interestRateForFemaleParamName, interestRateForChildrenParamName,
- interestRateForSeniorCitizenParamName, currencyCodeParamName));
+ amountRangeToParamName, annualInterestRateParamName, currencyCodeParamName, incentivesParamName));
}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/ClientIncentiveAttributes.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/ClientIncentiveAttributes.java
deleted file mode 100644
index bc31d7cf8..000000000
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/ClientIncentiveAttributes.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-package org.mifosplatform.portfolio.interestratechart.data;
-
-
-/**
- * Immutable data object representing a ClientIncentiveAttributes used
- * for determining interest rate applicable from Interest rate chart.
- */
-public class ClientIncentiveAttributes {
-
- private final boolean isFemale;
- private final boolean isChild;
- private final boolean isSeniorCitizen;
-
-
- public static ClientIncentiveAttributes instance(final boolean isFemale, final boolean isChild, final boolean isSeniorCitizen) {
- return new ClientIncentiveAttributes(isFemale, isChild, isSeniorCitizen);
- }
-
-
-
- private ClientIncentiveAttributes(final boolean isFemale, final boolean isChild, final boolean isSeniorCitizen) {
- this.isFemale = isFemale;
- this.isChild = isChild;
- this.isSeniorCitizen = isSeniorCitizen;
- }
-
- public boolean isFemale(){
- return this.isFemale;
- }
-
- public boolean isChild(){
- return this.isChild;
- }
-
- public boolean isSeniorCitizen(){
- return this.isSeniorCitizen;
- }
-}
\ No newline at end of file
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/InterestIncentiveData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/InterestIncentiveData.java
new file mode 100755
index 000000000..e41809413
--- /dev/null
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/InterestIncentiveData.java
@@ -0,0 +1,70 @@
+package org.mifosplatform.portfolio.interestratechart.data;
+
+import java.math.BigDecimal;
+
+import org.mifosplatform.infrastructure.core.data.EnumOptionData;
+
+public class InterestIncentiveData {
+
+ @SuppressWarnings("unused")
+ private final Long id;
+ private final EnumOptionData entityType;
+ private final EnumOptionData attributeName;
+ private final EnumOptionData conditionType;
+ private final String attributeValue;
+ private final String attributeValueDesc;
+ private final EnumOptionData incentiveType;
+ private final BigDecimal amount;
+
+ public static InterestIncentiveData instance(final Long id, final EnumOptionData entityType, final EnumOptionData attributeName,
+ final EnumOptionData conditionType, final String attributeValue, final String attributeValueDesc,
+ final EnumOptionData incentiveType, final BigDecimal amount) {
+
+ return new InterestIncentiveData(id, entityType, attributeName, conditionType, attributeValue, attributeValueDesc, incentiveType,
+ amount);
+ }
+
+ private InterestIncentiveData(final Long id, final EnumOptionData entityType, final EnumOptionData attributeName,
+ final EnumOptionData conditionType, final String attributeValue, final String attributeValueDesc,
+ final EnumOptionData incentiveType, final BigDecimal amount) {
+
+ this.id = id;
+ this.entityType = entityType;
+ this.attributeName = attributeName;
+ this.conditionType = conditionType;
+ this.attributeValue = attributeValue;
+ this.attributeValueDesc = attributeValueDesc;
+ this.incentiveType = incentiveType;
+ this.amount = amount;
+
+ }
+
+ public EnumOptionData entityType() {
+ return this.entityType;
+ }
+
+ public EnumOptionData attributeName() {
+ return this.attributeName;
+ }
+
+ public EnumOptionData conditionType() {
+ return this.conditionType;
+ }
+
+ public String attributeValue() {
+ return this.attributeValue;
+ }
+
+ public EnumOptionData incentiveType() {
+ return this.incentiveType;
+ }
+
+ public BigDecimal amount() {
+ return this.amount;
+ }
+
+ public String attributeValueDesc() {
+ return this.attributeValueDesc;
+ }
+
+}
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/InterestIncentiveDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/InterestIncentiveDataValidator.java
new file mode 100755
index 000000000..12128f5a1
--- /dev/null
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/interestratechart/data/InterestIncentiveDataValidator.java
@@ -0,0 +1,160 @@
+/**
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+package org.mifosplatform.portfolio.interestratechart.data;
+
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.INCENTIVE_RESOURCE_NAME;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.INTERESTRATE_INCENTIVE_CREATE_REQUEST_DATA_PARAMETERS;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.INTERESTRATE_INCENTIVE_UPDATE_REQUEST_DATA_PARAMETERS;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.amountParamName;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.attributeNameParamName;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.attributeValueParamName;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.conditionTypeParamName;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.entityTypeParamName;
+import static org.mifosplatform.portfolio.interestratechart.InterestIncentiveApiConstants.incentiveTypeparamName;
+import static org.mifosplatform.portfolio.interestratechart.InterestRateChartApiConstants.descriptionParamName;
+
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.mifosplatform.infrastructure.core.data.ApiParameterError;
+import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder;
+import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
+import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException;
+import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
+import org.mifosplatform.portfolio.common.domain.ConditionType;
+import org.mifosplatform.portfolio.interestratechart.incentive.InterestIncentiveAttributeName;
+import org.mifosplatform.portfolio.interestratechart.incentive.InterestIncentiveEntityType;
+import org.mifosplatform.portfolio.interestratechart.incentive.InterestIncentiveType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+
+@Component
+public class InterestIncentiveDataValidator {
+
+ private final FromJsonHelper fromApiJsonHelper;
+
+ @Autowired
+ public InterestIncentiveDataValidator(final FromJsonHelper fromApiJsonHelper) {
+ this.fromApiJsonHelper = fromApiJsonHelper;
+ }
+
+ public void validateCreate(final String json) {
+ if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
+
+ final Type typeOfMap = new TypeToken