diff --git a/mifosng-db/patches/0002-guarantor-redux.sql b/mifosng-db/patches/0002-guarantor-redux.sql new file mode 100755 index 000000000..af7791880 --- /dev/null +++ b/mifosng-db/patches/0002-guarantor-redux.sql @@ -0,0 +1,48 @@ +-- Guarantor table is no longer an external Table +DELETE FROM `x_registered_table` WHERE `registered_table_name`='m_guarantor_external' LIMIT 1; + +-- drop guarantor table +drop table m_guarantor_external; + +-- New m_guarantor table +CREATE TABLE `m_guarantor` ( + `id` BIGINT(20) NOT NULL AUTO_INCREMENT, + `loan_id` BIGINT(20) NOT NULL, + `type_enum` SMALLINT(5) NOT NULL, + `entity_id` BIGINT(20) NULL DEFAULT NULL, + `firstname` VARCHAR(50) NULL DEFAULT NULL, + `lastname` VARCHAR(50) NULL DEFAULT NULL, + `dob` DATE NULL DEFAULT NULL, + `address_line_1` VARCHAR(500) NULL DEFAULT NULL, + `address_line_2` VARCHAR(500) NULL DEFAULT NULL, + `city` VARCHAR(50) NULL DEFAULT NULL, + `state` VARCHAR(50) NULL DEFAULT NULL, + `country` VARCHAR(50) NULL DEFAULT NULL, + `zip` VARCHAR(20) NULL DEFAULT NULL, + `house_phone_number` VARCHAR(20) NULL DEFAULT NULL, + `mobile_number` VARCHAR(20) NULL DEFAULT NULL, + `comment` VARCHAR(500) NULL DEFAULT NULL, + PRIMARY KEY (`id`), + INDEX `FK_m_guarantor_m_loan` (`loan_id`), + CONSTRAINT `FK_m_guarantor_m_loan` FOREIGN KEY (`loan_id`) REFERENCES `m_loan` (`id`) +) +COLLATE='utf8_general_ci' +ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Update loan table + +ALTER TABLE `m_loan` + DROP FOREIGN KEY `FK_m_loan_guarantor`; + +update m_loan +set guarantor_id=null; + +ALTER TABLE `m_loan` + ADD CONSTRAINT `FK_m_loan_guarantor` FOREIGN KEY (`guarantor_id`) REFERENCES `m_guarantor` (`id`); + +-- Insert new permissions +INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`) VALUES ('portfolio', 'CREATE_GUARANTOR', 'GUARANTOR', 'CREATE', 1); +INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`) VALUES ('portfolio', 'DELETE_GUARANTOR', 'GUARANTOR', 'DELETE', 1); +INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`) VALUES ('portfolio', 'READ_GUARANTOR', 'GUARANTOR', 'READ', 0); +INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`) VALUES ('portfolio', 'UPDATE_GUARANTOR', 'GUARANTOR', 'UPDATE', 1); + diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/api/infrastructure/impl/AccountingApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/api/infrastructure/impl/AccountingApiDataConversionServiceImpl.java index daf9fc8c6..1f77579fd 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/api/infrastructure/impl/AccountingApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/api/infrastructure/impl/AccountingApiDataConversionServiceImpl.java @@ -75,8 +75,8 @@ public class AccountingApiDataConversionServiceImpl implements AccountingApiData final String glCode = helper.extractStringNamed("glCode", element, requestParamatersDetected); final Boolean disabled = helper.extractBooleanNamed("disabled", element, requestParamatersDetected); final Boolean manualEntriesAllowed = helper.extractBooleanNamed("manualEntriesAllowed", element, requestParamatersDetected); - final Integer category = helper.extractIntegerFromUnFormattedStringNamed("classification", element, requestParamatersDetected); - final Integer usage = helper.extractIntegerFromUnFormattedStringNamed("usage", element, requestParamatersDetected); + final Integer category = helper.extractIntegerSansLocaleNamed("classification", element, requestParamatersDetected); + final Integer usage = helper.extractIntegerSansLocaleNamed("usage", element, requestParamatersDetected); final String description = helper.extractStringNamed("description", element, requestParamatersDetected); return new GLAccountCommand(requestParamatersDetected, resourceIdentifier, name, parentId, glCode, disabled, manualEntriesAllowed, diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandWrapper.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandWrapper.java index 202555a32..3a999b255 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandWrapper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/domain/CommandWrapper.java @@ -173,6 +173,10 @@ public class CommandWrapper { public boolean isStaffResource() { return this.entityName.equalsIgnoreCase("STAFF"); } + + public boolean isGuarantorResource() { + return this.entityName.equalsIgnoreCase("GUARANTOR"); + } public boolean isFundResource() { return this.entityName.equalsIgnoreCase("FUND"); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/service/CommandWrapperBuilder.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/service/CommandWrapperBuilder.java index 6f4d52d83..40fcc8545 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/service/CommandWrapperBuilder.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/service/CommandWrapperBuilder.java @@ -150,6 +150,30 @@ public class CommandWrapperBuilder { this.href = "/staff/" + staffId; return this; } + + public CommandWrapperBuilder createGuarantor() { + this.actionName = "CREATE"; + this.entityName = "GUARANTOR"; + this.entityId = null; + this.href = "/guarantors/template"; + return this; + } + + public CommandWrapperBuilder updateGuarantor(final Long guarantorId) { + this.actionName = "UPDATE"; + this.entityName = "GUARANTOR"; + this.entityId = guarantorId; + this.href = "/guarantors/" + guarantorId; + return this; + } + + public CommandWrapperBuilder deleteGuarantor(final Long guarantorId) { + this.actionName = "DELETE"; + this.entityName = "GUARANTOR"; + this.entityId = guarantorId; + this.href = "/guarantors/" + guarantorId; + return this; + } public CommandWrapperBuilder createFund() { this.actionName = "CREATE"; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/commands/service/SynchronousCommandProcessingService.java b/mifosng-provider/src/main/java/org/mifosplatform/commands/service/SynchronousCommandProcessingService.java index 756a96bba..0646b5226 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/commands/service/SynchronousCommandProcessingService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/commands/service/SynchronousCommandProcessingService.java @@ -180,6 +180,14 @@ public class SynchronousCommandProcessingService implements CommandProcessingSer } else { throw new UnsupportedCommandException(wrapper.commandName()); } + } else if (wrapper.isGuarantorResource()) { + if (wrapper.isCreate()) { + handler = applicationContext.getBean("createGuarantorCommandHandler", NewCommandSourceHandler.class); + } else if (wrapper.isUpdate()) { + handler = applicationContext.getBean("updateGuarantorCommandHandler", NewCommandSourceHandler.class); + } else { + throw new UnsupportedCommandException(wrapper.commandName()); + } } else if (wrapper.isCodeResource()) { if (wrapper.isCreate()) { handler = applicationContext.getBean("createCodeCommandHandler", NewCommandSourceHandler.class); 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 83013f2db..cb739dd11 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 @@ -2,6 +2,7 @@ package org.mifosplatform.infrastructure.core.api; import java.math.BigDecimal; import java.util.Arrays; +import java.util.Date; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; @@ -195,6 +196,14 @@ public final class JsonCommand { public Long longValueOfParameterNamed(final String parameterName) { return this.fromApiJsonHelper.extractLongNamed(parameterName, parsedCommand); } + + public boolean isChangeInDateParameterNamed(final String parameterName, final Date existingValue) { + LocalDate localDate = null; + if (existingValue != null) { + localDate = LocalDate.fromDateFields(existingValue); + } + return isChangeInLocalDateParameterNamed( parameterName, localDate); + } public boolean isChangeInLocalDateParameterNamed(final String parameterName, final LocalDate existingValue) { boolean isChanged = false; @@ -208,6 +217,12 @@ public final class JsonCommand { public LocalDate localDateValueOfParameterNamed(final String parameterName) { return this.fromApiJsonHelper.extractLocalDateNamed(parameterName, parsedCommand); } + + public Date DateValueOfParameterNamed(final String parameterName) { + LocalDate localDate = this.fromApiJsonHelper.extractLocalDateNamed(parameterName, parsedCommand); + if (localDate == null) { return null; } + return localDate.toDateMidnight().toDate(); + } public boolean isChangeInStringParameterNamed(final String parameterName, final String existingValue) { boolean isChanged = false; @@ -248,6 +263,12 @@ public final class JsonCommand { public Integer integerValueOfParameterNamed(final String parameterName) { return this.fromApiJsonHelper.extractIntegerWithLocaleNamed(parameterName, parsedCommand); } + + public Integer integerValueSansLocaleOfParameterNamed(final String parameterName) { + return this.fromApiJsonHelper.extractIntegerSansLocaleNamed(parameterName, parsedCommand); + } + + public boolean isChangeInBooleanParameterNamed(final String parameterName, final Boolean existingValue) { boolean isChanged = false; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java index 8c34aba8c..928a733fa 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/FromJsonHelper.java @@ -141,6 +141,10 @@ public class FromJsonHelper { return helperDelegator.extractIntegerWithLocaleNamed(parameterName, element.getAsJsonObject(), new HashSet()); } + public Integer extractIntegerSansLocaleNamed(final String parameterName, final JsonElement element){ + return helperDelegator.extractIntegerSansLocaleNamed(parameterName, element.getAsJsonObject(), new HashSet()); + } + public Integer extractIntegerWithLocaleNamed(final String parameterName, final JsonElement element, final Set parametersPassedInRequest) { return helperDelegator.extractIntegerWithLocaleNamed(parameterName, element.getAsJsonObject(), parametersPassedInRequest); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/JsonParserHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/JsonParserHelper.java index 89f14d813..e03b0d0ee 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/JsonParserHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/core/serialization/JsonParserHelper.java @@ -144,7 +144,7 @@ public class JsonParserHelper { * @param parametersPassedInRequest * @return */ - public Integer extractIntegerFromUnFormattedStringNamed(final String parameterName, final JsonElement element, final Set parametersPassedInRequest) { + public Integer extractIntegerSansLocaleNamed(final String parameterName, final JsonElement element, final Set parametersPassedInRequest) { Integer intValue = null; if (element.isJsonObject()) { JsonObject object = element.getAsJsonObject(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java index 9e7e494b5..80abfeb07 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/staff/data/StaffData.java @@ -41,4 +41,41 @@ public class StaffData { this.officeId = officeId; this.allowedOffices = allowedOffices; } + + + public Long getId() { + return this.id; + } + + + public String getFirstname() { + return this.firstname; + } + + + public String getLastname() { + return this.lastname; + } + + + public String getDisplayName() { + return this.displayName; + } + + + public Long getOfficeId() { + return this.officeId; + } + + + public String getOfficeName() { + return this.officeName; + } + + + public boolean isLoanOfficer() { + return this.isLoanOfficer; + } + + } \ No newline at end of file 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 f2fd41c19..7bd164869 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 @@ -122,4 +122,29 @@ final public class ClientData { public ClientData currentChange() { return this.currentChange; } + + public String getExternalId() { + return this.externalId; + } + + public String getFirstname() { + return this.firstname; + } + + public String getLastname() { + return this.lastname; + } + + public Long getOfficeId() { + return this.officeId; + } + + public String getOfficeName() { + return this.officeName; + } + + public LocalDate getJoinedDate() { + return this.joinedDate; + } + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java index 204604063..ebc664c57 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/api/LoansApiResource.java @@ -199,7 +199,7 @@ public class LoansApiResource { LoanScheduleData repaymentSchedule = null; LoanPermissionData permissions = null; Collection charges = null; - GuarantorData guarantorData = null; + Collection guarantors = null; boolean convenienceDataRequired = false; final Set associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters()); @@ -210,11 +210,10 @@ public class LoansApiResource { "charges", "guarantor")); } - boolean existsGuarantor = false; if (associationParameters.contains("guarantor")) { - if (guarantorReadPlatformService.existsGuarantor(loanId)) { - guarantorData = this.guarantorReadPlatformService.retrieveGuarantor(loanId); - existsGuarantor = true; + guarantors = this.guarantorReadPlatformService.retrieveGuarantorsForLoan(loanId); + if (CollectionUtils.isEmpty(guarantors)) { + guarantors = null; // set back to null so doesn't appear in JSON } } @@ -251,8 +250,7 @@ public class LoansApiResource { && (tolerance.isGreaterThan(totalOutstandingMoney) || tolerance.isEqualTo(totalOutstandingMoney)); loanRepaymentsCount = retrieveNonDisbursementTransactions(loanRepayments); - permissions = this.loanReadPlatformService.retrieveLoanPermissions(loanBasicDetails, isWaiveAllowed, loanRepaymentsCount, - existsGuarantor); + permissions = this.loanReadPlatformService.retrieveLoanPermissions(loanBasicDetails, isWaiveAllowed, loanRepaymentsCount); // clear parent data which wasn't requested if (!associationParameters.contains("repaymentSchedule")) { @@ -302,7 +300,7 @@ public class LoansApiResource { final LoanAccountData loanAccount = new LoanAccountData(loanBasicDetails, convenienceDataRequired, repaymentSchedule, loanRepayments, permissions, charges, productOptions, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, - interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, null, guarantorData); + interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, null, guarantors); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializer.serialize(settings, loanAccount, LOAN_DATA_PARAMETERS); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java index 4ea49aa02..497d3350e 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanAccountData.java @@ -69,7 +69,7 @@ public class LoanAccountData { private final Collection charges; private final LoanPermissionData permissions; private final LoanConvenienceData convenienceData; - private final GuarantorData guarantorData; + private final Collection guarantors; // template private final Collection loanOfficerOptions; @@ -94,7 +94,7 @@ public class LoanAccountData { final Collection interestRateFrequencyTypeOptions, final Collection amortizationTypeOptions, final Collection interestTypeOptions, final Collection interestCalculationPeriodTypeOptions, final Collection fundOptions, final Collection chargeOptions, final ChargeData chargeTemplate, - final Collection loanOfficerOptions, final GuarantorData guarantorData) { + final Collection loanOfficerOptions, final Collection guarantors) { this.repaymentSchedule = repaymentSchedule; this.transactions = transactions; this.permissions = permissions; @@ -111,7 +111,7 @@ public class LoanAccountData { this.chargeOptions = chargeOptions; this.chargeTemplate = chargeTemplate; this.loanOfficerOptions = loanOfficerOptions; - this.guarantorData = guarantorData; + this.guarantors = guarantors; if (convenienceDataRequired) { int maxSubmittedOnOffsetFromToday = basicDetails.getMaxSubmittedOnOffsetFromToday(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java index da7d4bcf5..d72ac872d 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java @@ -80,10 +80,6 @@ public class Loan extends AbstractAuditableCustom { @JoinColumn(name = "client_id") private Client client; - @ManyToOne(optional = true) - @JoinColumn(name = "guarantor_id") - private Client guarantor; - @ManyToOne(optional = true) @JoinColumn(name = "group_id") private Group group; @@ -1953,14 +1949,6 @@ public class Loan extends AbstractAuditableCustom { return latestRecordWithNoEndDate; } - public Client getGuarantor() { - return guarantor; - } - - public void setGuarantor(Client guarantor) { - this.guarantor = guarantor; - } - public Client getClient() { return client; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/GuarantorConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/GuarantorConstants.java new file mode 100755 index 000000000..468605ca4 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/GuarantorConstants.java @@ -0,0 +1,42 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor; + +import java.util.HashSet; +import java.util.Set; + +public class GuarantorConstants { + + /*** + * Enum of all parameters passed in while creating/updating a loan product + ***/ + public static enum GUARANTOR_JSON_INPUT_PARAMS { + LOAN_ID("loanId"), GUARANTOR_TYPE_ID("guarantorTypeId"), ENTITY_ID("entityId"), FIRSTNAME("firstname"), LASTNAME("lastname"), ADDRESS_LINE_1( + "addressLine1"), ADDRESS_LINE_2("addressLine2"), CITY("city"), STATE("state"), ZIP("zip"), COUNTRY("country"), MOBILE_NUMBER( + "mobileNumber"), PHONE_NUMBER("housePhoneNumber"), COMMENT("comment"), DATE_OF_BIRTH("dob"), ; + + private final String value; + + private GUARANTOR_JSON_INPUT_PARAMS(final String value) { + this.value = value; + } + + private static final Set values = new HashSet(); + static { + for (GUARANTOR_JSON_INPUT_PARAMS type : GUARANTOR_JSON_INPUT_PARAMS.values()) { + values.add(type.value); + } + } + + public static Set getAllValues() { + return values; + } + + @Override + public String toString() { + return name().toString().replaceAll("_", " "); + } + + public String getValue() { + return this.value; + } + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/api/GuarantorsApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/api/GuarantorsApiResource.java index 8cbfdac0c..61a8a4c57 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/api/GuarantorsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/api/GuarantorsApiResource.java @@ -2,6 +2,7 @@ package org.mifosplatform.portfolio.loanaccount.gaurantor.api; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.ws.rs.Consumes; @@ -14,93 +15,117 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; -import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; +import org.mifosplatform.commands.domain.CommandWrapper; +import org.mifosplatform.commands.service.CommandWrapperBuilder; +import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService; +import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; +import org.mifosplatform.infrastructure.core.data.EnumOptionData; +import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; +import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; -import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; import org.mifosplatform.portfolio.loanaccount.gaurantor.data.GuarantorData; +import org.mifosplatform.portfolio.loanaccount.gaurantor.domain.GuarantorType; +import org.mifosplatform.portfolio.loanaccount.gaurantor.service.GuarantorEnumerations; import org.mifosplatform.portfolio.loanaccount.gaurantor.service.GuarantorReadPlatformService; -import org.mifosplatform.portfolio.loanaccount.gaurantor.service.GuarantorWritePlatformService; -import org.mifosplatform.portfolio.savingsaccount.PortfolioApiDataConversionService; -import org.mifosplatform.portfolio.savingsaccount.PortfolioApiJsonSerializerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -@Path("/loans/{loanId}/guarantor") +@Path("/guarantors") @Component @Scope("singleton") public class GuarantorsApiResource { - @Autowired - private GuarantorWritePlatformService guarantorWritePlatformService; - - @Autowired - private GuarantorReadPlatformService guarantorReadPlatformService; - - @Autowired - private PortfolioApiDataConversionService apiDataConversionService; - - @Autowired - private PortfolioApiJsonSerializerService apiJsonSerializerService; - - private static final Set typicalResponseParameters = new HashSet(Arrays.asList("externalGuarantor", "existingClientId", + private static final Set RESPONSE_DATA_PARAMETERS = new HashSet(Arrays.asList("externalGuarantor", "existingClientId", "firstname", "lastname", "addressLine1", "addressLine2", "city", "state", "zip", "country", "mobileNumber", "housePhoneNumber", "comment", "dob")); - private final String SystemEntityType = "m_guarantor_external"; + private final String resourceNameForPermission = "GUARANTOR"; + + private final GuarantorReadPlatformService guarantorReadPlatformService; + private final DefaultToApiJsonSerializer apiJsonSerializerService; + private final ApiRequestParameterHelper apiRequestParameterHelper; + private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; + private final PlatformSecurityContext context; @Autowired - private PlatformSecurityContext context; + public GuarantorsApiResource(final PlatformSecurityContext context, final GuarantorReadPlatformService guarantorReadPlatformService, + final DefaultToApiJsonSerializer toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper, + final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { + this.context = context; + this.apiRequestParameterHelper = apiRequestParameterHelper; + this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; + this.apiJsonSerializerService = toApiJsonSerializer; + this.guarantorReadPlatformService = guarantorReadPlatformService; + } @GET + @Path("template") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String retrieveGuarantorDetails(@Context final UriInfo uriInfo, @PathParam("loanId") final Long loanId) { - context.authenticatedUser().validateHasReadPermission(SystemEntityType); - Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - if (responseParameters.isEmpty()) { - responseParameters.addAll(typicalResponseParameters); + public String newGuarantorTemplate(@Context final UriInfo uriInfo) { + context.authenticatedUser().validateHasReadPermission(resourceNameForPermission); + + GuarantorData guarantorData = guarantorReadPlatformService.retrieveNewGuarantorDetails(); + + final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + return this.apiJsonSerializerService.serialize(settings, guarantorData, RESPONSE_DATA_PARAMETERS); + } + + @GET + @Path("{guarantorId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveGuarantorDetails(@Context final UriInfo uriInfo, @PathParam("guarantorId") final Long guarantorId) { + context.authenticatedUser().validateHasReadPermission(resourceNameForPermission); + + GuarantorData guarantorData = guarantorReadPlatformService.retrieveGuarantor(guarantorId); + + final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + if (settings.isTemplate()) { + final List guarantorTypeOptions = GuarantorEnumerations.guarantorType(GuarantorType.values()); + guarantorData = GuarantorData.templateOnTop(guarantorData, guarantorTypeOptions); } - boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - GuarantorData guarantorData = guarantorReadPlatformService.retrieveGuarantor(loanId); - - return this.apiJsonSerializerService.serializeGuarantorDataToJson(prettyPrint, responseParameters, guarantorData); + return this.apiJsonSerializerService.serialize(settings, guarantorData, RESPONSE_DATA_PARAMETERS); } @POST @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public Response createGuarantor(@PathParam("loanId") final Long loanId, final String jsonRequestBody) { + public String createGuarantor(final String apiRequestBodyAsJson) { - final GuarantorCommand command = this.apiDataConversionService.convertJsonToGuarantorCommand(null, loanId, jsonRequestBody); + final CommandWrapper commandRequest = new CommandWrapperBuilder().createGuarantor().withJson(apiRequestBodyAsJson).build(); - this.guarantorWritePlatformService.createGuarantor(loanId, command); + final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); - // returns the loan Identifier for which the guarantor was associated - return Response.ok().entity(new CommandProcessingResult(loanId)).build(); + return this.apiJsonSerializerService.serialize(result); } @PUT + @Path("{guarantorId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public Response updateGuarantor(@PathParam("loanId") final Long loanId, final String jsonRequestBody) { - final GuarantorCommand command = this.apiDataConversionService.convertJsonToGuarantorCommand(null, loanId, jsonRequestBody); + public String updateGuarantor(@PathParam("guarantorId") final Long guarantorId, final String jsonRequestBody) { + final CommandWrapper commandRequest = new CommandWrapperBuilder().updateGuarantor(guarantorId).withJson(jsonRequestBody).build(); - this.guarantorWritePlatformService.updateGuarantor(loanId, command); + final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); - return Response.ok().entity(new CommandProcessingResult(loanId)).build(); + return this.apiJsonSerializerService.serialize(result); } @DELETE + @Path("{guarantorId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public Response deleteGuarantor(@PathParam("loanId") final Long loanId) { - this.guarantorWritePlatformService.removeGuarantor(loanId); - return Response.ok(new CommandProcessingResult(loanId)).build(); + public String deleteGuarantor(@PathParam("guarantorId") final Long guarantorId) { + final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteGuarantor(guarantorId).build(); + + final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); + + return this.apiJsonSerializerService.serialize(result); } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/command/GuarantorCommand.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/command/GuarantorCommand.java index e3600df67..cbdf52bd6 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/command/GuarantorCommand.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/command/GuarantorCommand.java @@ -1,19 +1,27 @@ package org.mifosplatform.portfolio.loanaccount.gaurantor.command; -import java.util.Set; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.joda.time.LocalDate; +import org.mifosplatform.infrastructure.core.data.ApiParameterError; +import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder; +import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; +import org.mifosplatform.portfolio.loanaccount.gaurantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS; +import org.mifosplatform.portfolio.loanaccount.gaurantor.domain.GuarantorType; /** * Immutable command for creating or updating details of a Guarantor. */ public class GuarantorCommand { - private final boolean externalGuarantor; - /*** Fields for current customers serving as guarantors **/ - private final Long existingClientId; + private final Long loanId; + private final Integer guarantorTypeId; + private final Long entityId; /*** Fields for external persons serving as guarantors ***/ - // FIXME - kw - what if the details for collecting guarantors change? we are using datatable approach but embedding a structure here? private final String firstname; private final String lastname; private final String addressLine1; @@ -25,24 +33,16 @@ public class GuarantorCommand { private final String mobileNumber; private final String housePhoneNumber; private final String comment; - private final String dob; + private final LocalDate dob; - /** Feilds for passing Locale info to generic data service api **/ - private String dateFormat; - private String locale; - - private final Set modifiedParameters; - - public GuarantorCommand(final Set modifiedParameters, final Long existingClientId, final String firstname, - final String lastname, final Boolean externalGuarantor, final String addressLine1, final String addressLine2, - final String city, final String state, final String zip, final String country, final String mobileNumber, - final String housePhoneNumber, final String comment, final String dob) { - this.modifiedParameters = modifiedParameters; - - this.externalGuarantor = externalGuarantor; - - /*** Fields for current customers serving as guarantors **/ - this.existingClientId = existingClientId; + public GuarantorCommand(final Long loanId, final Integer guarantorTypeId, final Long entityId, final String firstname, + final String lastname, final String addressLine1, final String addressLine2, final String city, final String state, + final String zip, final String country, final String mobileNumber, final String housePhoneNumber, final String comment, + final LocalDate dob) { + this.loanId = loanId; + /*** Fields for current entities serving as guarantors **/ + this.guarantorTypeId = guarantorTypeId; + this.entityId = entityId; /*** Fields for external persons serving as guarantors ***/ this.firstname = firstname; @@ -59,80 +59,105 @@ public class GuarantorCommand { this.dob = dob; } - public String getFirstname() { - return firstname; + public boolean isExternalGuarantor() { + return GuarantorType.EXTERNAL.getValue().equals(guarantorTypeId); } - public String getLastname() { - return lastname; + public Date getDobAsDate() { + return this.dob.toDateMidnight().toDate(); } - public Boolean isExternalGuarantor() { - return externalGuarantor; + public void validateForCreate() { + + List dataValidationErrors = new ArrayList(); + + DataValidatorBuilder baseDataValidator = getDataValidator(dataValidationErrors); + + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.LOAN_ID.getValue()).value(this.loanId).notNull() + .integerGreaterThanZero(); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue()).value(this.guarantorTypeId).notNull() + .inMinMaxRange(GuarantorType.getMinValue(), GuarantorType.getMaxValue()); + + // validate for existing Client or Staff serving as gurantor + if (!this.isExternalGuarantor()) { + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID.getValue()).value(this.entityId).notNull() + .integerGreaterThanZero(); + } else { + // validate for an external guarantor + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.FIRSTNAME.getValue()).value(this.firstname).notBlank() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.LASTNAME.getValue()).value(this.lastname).notBlank() + .notExceedingLengthOf(50); + validateNonMandatoryFieldsForMaxLength(baseDataValidator); + } + + if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", + "Validation errors exist.", dataValidationErrors); } } - public Long getExistingClientId() { - return existingClientId; + public void validateForUpdate() { + List dataValidationErrors = new ArrayList(); + + DataValidatorBuilder baseDataValidator = getDataValidator(dataValidationErrors); + + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue()).value(this.guarantorTypeId) + .ignoreIfNull().inMinMaxRange(GuarantorType.getMinValue(), GuarantorType.getMaxValue()); + + // validate for existing Client or Staff serving as gurantor + if (!this.isExternalGuarantor()) { + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID.getValue()).value(this.entityId).ignoreIfNull() + .integerGreaterThanZero(); + } else { + // TODO: Vishwas this validation is buggy (it is compulsory to + // update + // firstname and last name when a guarantor type is changed), to be + // corrected while + // refactoring for maker checker + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.FIRSTNAME.getValue()).value(this.firstname).ignoreIfNull() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.LASTNAME.getValue()).value(this.lastname).ignoreIfNull() + .notExceedingLengthOf(50); + + validateNonMandatoryFieldsForMaxLength(baseDataValidator); + } + baseDataValidator.reset().anyOfNotNull(this.entityId, this.addressLine1, this.addressLine2, this.city, this.comment, this.country, + this.firstname, this.housePhoneNumber, this.lastname, this.mobileNumber, this.state, this.zip); + + if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", + "Validation errors exist.", dataValidationErrors); } } - public String getAddressLine1() { - return addressLine1; + /** + * @param baseDataValidator + */ + private void validateNonMandatoryFieldsForMaxLength(DataValidatorBuilder baseDataValidator) { + // validate non mandatory fields for length + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_1.getValue()).value(this.addressLine1).ignoreIfNull() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_2.getValue()).value(this.addressLine2).ignoreIfNull() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.CITY.getValue()).value(this.city).ignoreIfNull() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.STATE.getValue()).value(this.state).ignoreIfNull() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.ZIP.getValue()).value(this.zip).ignoreIfNull() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.COUNTRY.getValue()).value(this.country).ignoreIfNull() + .notExceedingLengthOf(50); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.MOBILE_NUMBER.getValue()).value(this.mobileNumber).ignoreIfNull() + .notExceedingLengthOf(20); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.PHONE_NUMBER.getValue()).value(this.housePhoneNumber) + .ignoreIfNull().notExceedingLengthOf(20); + baseDataValidator.reset().parameter(GUARANTOR_JSON_INPUT_PARAMS.COMMENT.getValue()).value(this.comment).ignoreIfNull() + .notExceedingLengthOf(500); } - public String getAddressLine2() { - return addressLine2; + /** + * @param dataValidationErrors + * @return + */ + private DataValidatorBuilder getDataValidator(List dataValidationErrors) { + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("Guarantor"); + return baseDataValidator; } - - public String getCity() { - return city; - } - - public String getState() { - return state; - } - - public String getZip() { - return zip; - } - - public String getCountry() { - return country; - } - - public String getMobileNumber() { - return mobileNumber; - } - - public String getHousePhoneNumber() { - return housePhoneNumber; - } - - public String getComment() { - return comment; - } - - public Set getModifiedParameters() { - return modifiedParameters; - } - - public String getDob() { - return dob; - } - - public String getDateFormat() { - return dateFormat; - } - - public void setDateFormat(String dateFormat) { - this.dateFormat = dateFormat; - } - - public String getLocale() { - return locale; - } - - public void setLocale(String locale) { - this.locale = locale; - } - } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/command/GuarantorCommandValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/command/GuarantorCommandValidator.java deleted file mode 100644 index 2257a7bee..000000000 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/command/GuarantorCommandValidator.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.mifosplatform.portfolio.loanaccount.gaurantor.command; - -import java.util.ArrayList; -import java.util.List; - -import org.mifosplatform.infrastructure.core.data.ApiParameterError; -import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder; -import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; - -public class GuarantorCommandValidator { - - private final GuarantorCommand command; - - public GuarantorCommandValidator(GuarantorCommand command) { - this.command = command; - } - - public void validateForCreate() { - - List dataValidationErrors = new ArrayList(); - - DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("Guarantor"); - - // validate for existing Client - if (command.isExternalGuarantor() == null || command.isExternalGuarantor() == false) { - baseDataValidator.reset().parameter("existingClientId").value(command.getExistingClientId()).notNull().integerGreaterThanZero(); - } else { - // validate for an external guarantor - baseDataValidator.reset().parameter("firstname").value(command.getFirstname()).notBlank().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("lastname").value(command.getLastname()).notBlank().notExceedingLengthOf(50); - - validateNonMandatoryFieldsForMaxLength(baseDataValidator); - } - - if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", - "Validation errors exist.", dataValidationErrors); } - } - - public void validateForUpdate() { - List dataValidationErrors = new ArrayList(); - - DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("Guarantor"); - - // validate for existing Client - if (command.isExternalGuarantor() == null || command.isExternalGuarantor() == false) { - baseDataValidator.reset().parameter("existingClientId").value(command.getExistingClientId()).notNull().integerGreaterThanZero(); - } else { - // validate for an external guarantor - baseDataValidator.reset().parameter("firstname").value(command.getFirstname()).notBlank().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("lastname").value(command.getLastname()).notBlank().notExceedingLengthOf(50); - - validateNonMandatoryFieldsForMaxLength(baseDataValidator); - } - baseDataValidator.reset().anyOfNotNull(command.getExistingClientId(), command.getAddressLine1(), command.getAddressLine2(), - command.getCity(), command.getComment(), command.getCountry(), command.getFirstname(), command.getHousePhoneNumber(), - command.getLastname(), command.getMobileNumber(), command.getState(), command.getZip()); - - if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", - "Validation errors exist.", dataValidationErrors); } - } - - /** - * @param baseDataValidator - */ - private void validateNonMandatoryFieldsForMaxLength(DataValidatorBuilder baseDataValidator) { - // validate non mandatory fields for length - baseDataValidator.reset().parameter("addressLine1").value(command.getAddressLine1()).ignoreIfNull().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("addressLine2").value(command.getAddressLine2()).ignoreIfNull().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("city").value(command.getCity()).ignoreIfNull().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("state").value(command.getState()).ignoreIfNull().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("zip").value(command.getZip()).ignoreIfNull().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("country").value(command.getCountry()).ignoreIfNull().notExceedingLengthOf(50); - baseDataValidator.reset().parameter("mobileNumber").value(command.getMobileNumber()).ignoreIfNull().notExceedingLengthOf(20); - baseDataValidator.reset().parameter("housePhoneNumber").value(command.getHousePhoneNumber()).ignoreIfNull() - .notExceedingLengthOf(20); - baseDataValidator.reset().parameter("comment").value(command.getComment()).ignoreIfNull().notExceedingLengthOf(500); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/data/GuarantorData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/data/GuarantorData.java index 647ea1cf4..ddab82d36 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/data/GuarantorData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/data/GuarantorData.java @@ -1,196 +1,111 @@ package org.mifosplatform.portfolio.loanaccount.gaurantor.data; +import java.util.List; + import org.joda.time.LocalDate; +import org.mifosplatform.infrastructure.core.data.EnumOptionData; +import org.mifosplatform.organisation.staff.data.StaffData; +import org.mifosplatform.portfolio.client.data.ClientData; +import org.mifosplatform.portfolio.loanaccount.gaurantor.domain.GuarantorType; +import org.mifosplatform.portfolio.loanaccount.gaurantor.service.GuarantorEnumerations; public class GuarantorData { - private String firstname; - private String lastname; - private boolean externalGuarantor; - /*** Fields for current customers serving as guarantors **/ - private Long existingClientId; - private String externalId; - private String officeName; - private LocalDate joinedDate; + private final Long id; + private final Long loanId; + private final EnumOptionData guarantorType; - /*** Fields for external persons serving as guarantors ***/ - private String addressLine1; - private String addressLine2; - private String city; - private String state; - private String zip; - private String country; - private String mobileNumber; - private String housePhoneNumber; - private String comment; - private LocalDate dob; + private final String firstname; + private final String lastname; - public GuarantorData(final Long existingClientId, final String firstname, - final String lastname, final String externalId, - final String officeName, final LocalDate joinedDate) { - this.existingClientId = existingClientId; - this.firstname = firstname; - this.lastname = lastname; - this.externalId = externalId; - this.officeName = officeName; - this.joinedDate = joinedDate; - this.externalGuarantor = false; - } + /*** Fields for current customers/staff serving as guarantors **/ + private final Long entityId; + private final String externalId; + private final String officeName; + private final LocalDate joinedDate; - public GuarantorData(final String firstname, final String lastname, - final LocalDate dob, final String addressLine1, - final String addressLine2, final String city, final String state, - final String zip, final String country, final String mobileNumber, - final String housePhoneNumber, final String comment) { - this.firstname = firstname; - this.lastname = lastname; - this.dob = dob; - this.addressLine1 = addressLine1; - this.addressLine2 = addressLine2; - this.city = city; - this.state = state; - this.zip = zip; - this.country = country; - this.mobileNumber = mobileNumber; - this.housePhoneNumber = housePhoneNumber; - this.comment = comment; - this.externalGuarantor = true; - } + /*** Fields for external persons serving as guarantors ***/ - public String getFirstname() { - return firstname; - } + private final String addressLine1; + private final String addressLine2; + private final String city; + private final String state; + private final String zip; + private final String country; + private final String mobileNumber; + private final String housePhoneNumber; + private final String comment; + private final LocalDate dob; - public void setFirstname(String firstname) { - this.firstname = firstname; - } + // template + @SuppressWarnings("unused") + private final List guarantorTypeOptions; - public String getLastname() { - return lastname; - } + public static GuarantorData template(final List guarantorTypeOptions) { + return new GuarantorData(null, null, null, GuarantorEnumerations.guarantorType(GuarantorType.CUSTOMER), null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, guarantorTypeOptions); + } - public void setLastname(String lastname) { - this.lastname = lastname; - } + public static GuarantorData templateOnTop(final GuarantorData guarantorData, final List guarantorTypeOptions) { + return new GuarantorData(guarantorData.id, guarantorData.loanId, guarantorData.entityId, guarantorData.guarantorType, + guarantorData.firstname, guarantorData.lastname, guarantorData.dob, guarantorData.addressLine1, guarantorData.addressLine2, + guarantorData.city, guarantorData.state, guarantorData.zip, guarantorData.country, guarantorData.mobileNumber, + guarantorData.housePhoneNumber, guarantorData.comment, guarantorData.officeName, guarantorData.joinedDate, + guarantorData.externalId, guarantorTypeOptions); + } - public Long getExistingClientId() { - return existingClientId; - } + public static GuarantorData mergeClientData(ClientData clientData, GuarantorData guarantorData) { + return new GuarantorData(guarantorData.id, guarantorData.loanId, guarantorData.entityId, guarantorData.guarantorType, + clientData.getFirstname(), clientData.getLastname(), null, null, null, null, null, null, null, null, null, null, + clientData.getOfficeName(), clientData.getJoinedDate(), clientData.getExternalId(), null); + } - public void setExistingClientId(Long existingClientId) { - this.existingClientId = existingClientId; - } + public static GuarantorData mergeStaffData(StaffData staffData, GuarantorData guarantorData) { + return new GuarantorData(guarantorData.id, guarantorData.loanId, guarantorData.entityId, guarantorData.guarantorType, + staffData.getFirstname(), staffData.getLastname(), null, null, null, null, null, null, null, null, null, null, + staffData.getOfficeName(), null, null, null); + } - public String getExternalId() { - return externalId; - } + public GuarantorData(Long id, Long loanId, Long entityId, EnumOptionData guarantorType, String firstname, String lastname, + LocalDate dob, String addressLine1, String addressLine2, String city, String state, String zip, String country, + String mobileNumber, String housePhoneNumber, String comment, String officeName, LocalDate joinedDate, String externalId, + List guarantorTypeOptions) { + this.id = id; + this.loanId = loanId; + this.guarantorType = guarantorType; + this.entityId = entityId; + this.firstname = firstname; + this.lastname = lastname; + this.dob = dob; + this.addressLine1 = addressLine1; + this.addressLine2 = addressLine2; + this.city = city; + this.state = state; + this.zip = zip; + this.country = country; + this.mobileNumber = mobileNumber; + this.housePhoneNumber = housePhoneNumber; + this.comment = comment; + this.officeName = officeName; + this.joinedDate = joinedDate; + this.externalId = externalId; + this.guarantorTypeOptions = guarantorTypeOptions; + } - public void setExternalId(String externalId) { - this.externalId = externalId; - } + public boolean isExternalGuarantor() { + return GuarantorType.EXTERNAL.getValue().equals(guarantorType.getId()); + } - public String getOfficeName() { - return officeName; - } + public boolean isExistingClient() { + return GuarantorType.CUSTOMER.getValue().equals(guarantorType.getId()); + } - public void setOfficeName(String officeName) { - this.officeName = officeName; - } + public boolean isStaffMember() { + return GuarantorType.STAFF.getValue().equals(guarantorType.getId()); + } - public LocalDate getJoinedDate() { - return joinedDate; - } - - public void setJoinedDate(LocalDate joinedDate) { - this.joinedDate = joinedDate; - } - - public String getAddressLine1() { - return addressLine1; - } - - public void setAddressLine1(String addressLine1) { - this.addressLine1 = addressLine1; - } - - public String getAddressLine2() { - return addressLine2; - } - - public void setAddressLine2(String addressLine2) { - this.addressLine2 = addressLine2; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getZip() { - return zip; - } - - public void setZip(String zip) { - this.zip = zip; - } - - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getMobileNumber() { - return mobileNumber; - } - - public void setMobileNumber(String mobileNumber) { - this.mobileNumber = mobileNumber; - } - - public String getHousePhoneNumber() { - return housePhoneNumber; - } - - public void setHousePhoneNumber(String housePhoneNumber) { - this.housePhoneNumber = housePhoneNumber; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - - public boolean getExternalGuarantor() { - return externalGuarantor; - } - - public void setExternalGuarantor(boolean externalGuarantor) { - this.externalGuarantor = externalGuarantor; - } - - public LocalDate getDob() { - return dob; - } - - public void setDob(LocalDate dob) { - this.dob = dob; - } + public Long getEntityId() { + return this.entityId; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/Guarantor.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/Guarantor.java new file mode 100755 index 000000000..b57ac7ba5 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/Guarantor.java @@ -0,0 +1,263 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.domain; + +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.Map; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.apache.commons.lang.StringUtils; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.portfolio.loanaccount.domain.Loan; +import org.mifosplatform.portfolio.loanaccount.gaurantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS; +import org.springframework.data.jpa.domain.AbstractPersistable; + +@Entity +@Table(name = "m_guarantor") +public class Guarantor extends AbstractPersistable { + + @ManyToOne + @JoinColumn(name = "loan_id", nullable = false) + private Loan loan; + + @Column(name = "type_enum", nullable = false) + private Integer gurantorType; + + @Column(name = "entity_id") + private Long entityId; + + @Column(name = "firstname", length = 50) + private String firstname; + + @Column(name = "lastname", length = 50) + private String lastname; + + @Column(name = "dob") + @Temporal(TemporalType.DATE) + private Date dateOfBirth; + + @Column(name = "address_line_1", length = 500) + private String addressLine1; + + @Column(name = "address_line_2", length = 500) + private String addressLine2; + + @Column(name = "city", length = 50) + private String city; + + @Column(name = "state", length = 50) + private String state; + + @Column(name = "country", length = 50) + private String country; + + @Column(name = "zip", length = 20) + private String zip; + + @Column(name = "house_phone_number", length = 20) + private String housePhoneNumber; + + @Column(name = "mobile_number", length = 20) + private String mobilePhoneNumber; + + @Column(name = "comment", length = 500) + private String comment; + + protected Guarantor() { + + } + + public static Guarantor createNew(Loan loan, Integer gurantorType, Long entityId, String firstname, String lastname, Date dateOfBirth, + String addressLine1, String addressLine2, String city, String state, String country, String zip, String housePhoneNumber, + String mobilePhoneNumber, String comment) { + return new Guarantor(loan, gurantorType, entityId, firstname, lastname, dateOfBirth, addressLine1, addressLine2, city, state, + country, zip, housePhoneNumber, mobilePhoneNumber, comment); + } + + public Guarantor(Loan loan, Integer gurantorType, Long entityId, String firstname, String lastname, Date dateOfBirth, + String addressLine1, String addressLine2, String city, String state, String country, String zip, String housePhoneNumber, + String mobilePhoneNumber, String comment) { + this.loan = loan; + this.gurantorType = gurantorType; + this.entityId = entityId; + this.firstname = StringUtils.defaultIfEmpty(firstname, null); + this.lastname = StringUtils.defaultIfEmpty(lastname, null); + this.dateOfBirth = dateOfBirth; + this.addressLine1 = StringUtils.defaultIfEmpty(addressLine1, null); + this.addressLine2 = StringUtils.defaultIfEmpty(addressLine2, null); + this.city = StringUtils.defaultIfEmpty(city, null); + this.state = StringUtils.defaultIfEmpty(state, null); + this.country = StringUtils.defaultIfEmpty(country, null); + this.zip = StringUtils.defaultIfEmpty(zip, null); + this.housePhoneNumber = StringUtils.defaultIfEmpty(housePhoneNumber, null); + this.mobilePhoneNumber = StringUtils.defaultIfEmpty(mobilePhoneNumber, null); + this.comment = StringUtils.defaultIfEmpty(comment, null); + } + + public static Guarantor fromJson(final Loan loan, final JsonCommand command) { + Integer gurantorType = command.integerValueSansLocaleOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue()); + Long entityId = command.longValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID.getValue()); + + if (GuarantorType.EXTERNAL.getValue().equals(gurantorType)) { + String firstname = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.FIRSTNAME.getValue()); + String lastname = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.LASTNAME.getValue()); + Date dateOfBirth = command.DateValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.DATE_OF_BIRTH.getValue()); + String addressLine1 = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_1.getValue()); + String addressLine2 = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_2.getValue()); + String city = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.CITY.getValue()); + String state = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.STATE.getValue()); + String country = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.COUNTRY.getValue()); + String zip = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.ZIP.getValue()); + String housePhoneNumber = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.PHONE_NUMBER.getValue()); + String mobilePhoneNumber = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.MOBILE_NUMBER.getValue()); + String comment = command.stringValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.COMMENT.getValue()); + + return new Guarantor(loan, gurantorType, entityId, firstname, lastname, dateOfBirth, addressLine1, addressLine2, city, state, + country, zip, housePhoneNumber, mobilePhoneNumber, comment); + } + + return new Guarantor(loan, gurantorType, entityId, null, null, null, null, null, null, null, null, null, null, null, null); + + } + + public Map update(final JsonCommand command) { + + final Map actualChanges = new LinkedHashMap(7); + + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue(), this.gurantorType, true); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID.getValue(), this.entityId); + + if (this.isExternalGuarantor()) { + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.FIRSTNAME.getValue(), this.firstname); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.LASTNAME.getValue(), this.lastname); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.DATE_OF_BIRTH.getValue(), this.dateOfBirth); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_1.getValue(), this.addressLine1); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_2.getValue(), this.addressLine2); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.CITY.getValue(), this.city); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.STATE.getValue(), this.state); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.COUNTRY.getValue(), this.country); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.ZIP.getValue(), this.zip); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.PHONE_NUMBER.getValue(), this.housePhoneNumber); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.MOBILE_NUMBER.getValue(), this.mobilePhoneNumber); + handlePropertyUpdate(command, actualChanges, GUARANTOR_JSON_INPUT_PARAMS.COMMENT.getValue(), this.comment); + } + + return actualChanges; + } + + public boolean isExistingCustomer() { + return GuarantorType.CUSTOMER.getValue().equals(this.gurantorType); + } + + public boolean isExistingEmployee() { + return GuarantorType.STAFF.getValue().equals(this.gurantorType); + } + + public boolean isExternalGuarantor() { + return GuarantorType.EXTERNAL.getValue().equals(this.gurantorType); + } + + private void handlePropertyUpdate(final JsonCommand command, final Map actualChanges, final String paramName, + Integer propertyToBeUpdated, boolean sansLocale) { + if (command.isChangeInIntegerParameterNamed(paramName, propertyToBeUpdated)) { + Integer newValue = null; + if (sansLocale) { + newValue = command.integerValueSansLocaleOfParameterNamed(paramName); + } else { + newValue = command.integerValueOfParameterNamed(paramName); + } + actualChanges.put(paramName, newValue); + propertyToBeUpdated = newValue; + + // now update actual property + if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue())) { + this.gurantorType = newValue; + } + } + } + + private void handlePropertyUpdate(final JsonCommand command, final Map actualChanges, final String paramName, + String propertyToBeUpdated) { + if (command.isChangeInStringParameterNamed(paramName, propertyToBeUpdated)) { + final String newValue = command.stringValueOfParameterNamed(paramName); + actualChanges.put(paramName, newValue); + propertyToBeUpdated = newValue; + + // now update actual property + if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.FIRSTNAME.getValue())) { + this.firstname = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.LASTNAME.getValue())) { + this.lastname = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_1.getValue())) { + this.addressLine1 = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_2.getValue())) { + this.addressLine2 = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.CITY.getValue())) { + this.city = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.STATE.getValue())) { + this.state = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.COUNTRY.getValue())) { + this.country = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.ZIP.getValue())) { + this.zip = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.PHONE_NUMBER.getValue())) { + this.housePhoneNumber = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.MOBILE_NUMBER.getValue())) { + this.mobilePhoneNumber = newValue; + } else if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.COMMENT.getValue())) { + this.comment = newValue; + } + } + } + + private void handlePropertyUpdate(final JsonCommand command, final Map actualChanges, final String paramName, + Long propertyToBeUpdated) { + if (command.isChangeInLongParameterNamed(paramName, propertyToBeUpdated)) { + final Long newValue = command.longValueOfParameterNamed(paramName); + actualChanges.put(paramName, newValue); + propertyToBeUpdated = newValue; + + // now update actual property + if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID.getValue())) { + this.entityId = newValue; + } + } + } + + private void handlePropertyUpdate(final JsonCommand command, final Map actualChanges, final String paramName, + Date propertyToBeUpdated) { + if (command.isChangeInDateParameterNamed(paramName, propertyToBeUpdated)) { + final Date newValue = command.DateValueOfParameterNamed(paramName); + actualChanges.put(paramName, newValue); + propertyToBeUpdated = newValue; + + // now update actual property + if (paramName.equals(GUARANTOR_JSON_INPUT_PARAMS.DATE_OF_BIRTH.getValue())) { + this.dateOfBirth = newValue; + } + } + } + + public Long getEntityId() { + return this.entityId; + } + + public Long getLoanId() { + return this.loan.getId(); + } + + public Long getClientId() { + return this.loan.getClientId(); + } + + public Long getOfficeId() { + return this.loan.getOfficeId(); + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/GuarantorRepository.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/GuarantorRepository.java new file mode 100755 index 000000000..91664a083 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/GuarantorRepository.java @@ -0,0 +1,8 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.domain; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface GuarantorRepository extends JpaRepository, JpaSpecificationExecutor { + // no behaviour +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/GuarantorType.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/GuarantorType.java new file mode 100755 index 000000000..905f9ba80 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/domain/GuarantorType.java @@ -0,0 +1,63 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.domain; + +import java.util.HashMap; +import java.util.Map; + +public enum GuarantorType { + CUSTOMER(1, "guarantor.existing.customer"), STAFF(2, "guarantor.staff"), EXTERNAL(3, "guarantor.external"); + + private final Integer value; + private final String code; + + private GuarantorType(final Integer value, final String code) { + this.value = value; + this.code = code; + } + + public Integer getValue() { + return this.value; + } + + public String getCode() { + return code; + } + + private static final Map intToEnumMap = new HashMap(); + private static int minValue; + private static int maxValue; + static { + int i = 0; + for (GuarantorType type : GuarantorType.values()) { + if (i == 0) { + minValue = type.value; + } + intToEnumMap.put(type.value, type); + if (minValue >= type.value) { + minValue = type.value; + } + if (maxValue < type.value) { + maxValue = type.value; + } + i = i + 1; + } + } + + public static GuarantorType fromInt(int i) { + GuarantorType type = intToEnumMap.get(Integer.valueOf(i)); + return type; + } + + public static int getMinValue() { + return minValue; + } + + public static int getMaxValue() { + return maxValue; + } + + @Override + public String toString() { + return name().toString(); + } + +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/GuarantorNotFoundException.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/GuarantorNotFoundException.java index 24764d4eb..ac626d418 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/GuarantorNotFoundException.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/GuarantorNotFoundException.java @@ -5,11 +5,9 @@ import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceN /** * A {@link RuntimeException} thrown when guarantor resources are not found. */ -public class GuarantorNotFoundException extends - AbstractPlatformResourceNotFoundException { +public class GuarantorNotFoundException extends AbstractPlatformResourceNotFoundException { - public GuarantorNotFoundException(Long id) { - super("error.msg.loan.guarantor.", "Loan with identifier " + id - + " does not have a guarantor associated with it", id); - } + public GuarantorNotFoundException(Long id) { + super("error.msg.loan.guarantor.", "Guarantor with identifier " + id + " does not exist", id); + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/InvalidGuarantorException.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/InvalidGuarantorException.java index f8b8d625f..0ad7af3c6 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/InvalidGuarantorException.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/exception/InvalidGuarantorException.java @@ -6,14 +6,11 @@ import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRul * {@link AbstractPlatformDomainRuleException} thrown when a Client is set as a * guarantor for his/her own loans */ -public class InvalidGuarantorException extends - AbstractPlatformDomainRuleException { +public class InvalidGuarantorException extends AbstractPlatformDomainRuleException { - public InvalidGuarantorException(Long clientId, Long loanId) { - super("error.msg.invalid.guarantor", "Tried to set Client with id " - + clientId - + " as a guarantor to his/her own loan with loan identifier =" - + loanId, clientId, loanId); - } + public InvalidGuarantorException(Long clientId, Long loanId) { + super("error.msg.invalid.guarantor", "Tried to set Client with id " + clientId + + " as a guarantor to his/her own loan with loan identifier =" + loanId, clientId, loanId); + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/CreateGuarantorCommandHandler.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/CreateGuarantorCommandHandler.java new file mode 100755 index 000000000..aab41ba27 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/CreateGuarantorCommandHandler.java @@ -0,0 +1,27 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.handler; + +import org.mifosplatform.commands.handler.NewCommandSourceHandler; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; +import org.mifosplatform.portfolio.loanaccount.gaurantor.service.GuarantorWritePlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class CreateGuarantorCommandHandler implements NewCommandSourceHandler { + + private final GuarantorWritePlatformService writePlatformService; + + @Autowired + public CreateGuarantorCommandHandler(final GuarantorWritePlatformService writePlatformService) { + this.writePlatformService = writePlatformService; + } + + @Transactional + @Override + public CommandProcessingResult processCommand(final JsonCommand command) { + + return this.writePlatformService.createGuarantor(command); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/DeleteGuarantorCommandHandler.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/DeleteGuarantorCommandHandler.java new file mode 100755 index 000000000..f0fea99b0 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/DeleteGuarantorCommandHandler.java @@ -0,0 +1,26 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.handler; + +import org.mifosplatform.commands.handler.NewCommandSourceHandler; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; +import org.mifosplatform.portfolio.loanaccount.gaurantor.service.GuarantorWritePlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class DeleteGuarantorCommandHandler implements NewCommandSourceHandler { + + private final GuarantorWritePlatformService guarantorWritePlatformService; + + @Autowired + public DeleteGuarantorCommandHandler(final GuarantorWritePlatformService guarantorWritePlatformService) { + this.guarantorWritePlatformService = guarantorWritePlatformService; + } + + @Transactional + @Override + public CommandProcessingResult processCommand(final JsonCommand command) { + return this.guarantorWritePlatformService.removeGuarantor(command.entityId()); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/UpdateGuarantorCommandHandler.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/UpdateGuarantorCommandHandler.java new file mode 100755 index 000000000..a031e0abc --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/handler/UpdateGuarantorCommandHandler.java @@ -0,0 +1,26 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.handler; + +import org.mifosplatform.commands.handler.NewCommandSourceHandler; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; +import org.mifosplatform.portfolio.loanaccount.gaurantor.service.GuarantorWritePlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class UpdateGuarantorCommandHandler implements NewCommandSourceHandler { + + private final GuarantorWritePlatformService writePlatformService; + + @Autowired + public UpdateGuarantorCommandHandler(final GuarantorWritePlatformService writePlatformService) { + this.writePlatformService = writePlatformService; + } + + @Transactional + @Override + public CommandProcessingResult processCommand(final JsonCommand command) { + return this.writePlatformService.updateGuarantor(command.entityId(), command); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/serialization/GuarantorCommandFromApiJsonDeserializer.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/serialization/GuarantorCommandFromApiJsonDeserializer.java new file mode 100755 index 000000000..b049d527b --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/serialization/GuarantorCommandFromApiJsonDeserializer.java @@ -0,0 +1,63 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.serialization; + +import java.lang.reflect.Type; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.joda.time.LocalDate; +import org.mifosplatform.infrastructure.core.exception.InvalidJsonException; +import org.mifosplatform.infrastructure.core.serialization.AbstractFromApiJsonDeserializer; +import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer; +import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; +import org.mifosplatform.portfolio.loanaccount.gaurantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS; +import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.google.gson.JsonElement; +import com.google.gson.reflect.TypeToken; + +/** + * Implementation of {@link FromApiJsonDeserializer} for + * {@link GuarantorCommand}'s. + */ +@Component +public final class GuarantorCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer { + + private final FromJsonHelper fromApiJsonHelper; + + @Autowired + public GuarantorCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper) { + this.fromApiJsonHelper = fromApiJsonHelper; + } + + @Override + public GuarantorCommand commandFromApiJson(String json) { + if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } + + final Type typeOfMap = new TypeToken>() {}.getType(); + fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, GUARANTOR_JSON_INPUT_PARAMS.getAllValues()); + + final JsonElement element = fromApiJsonHelper.parse(json); + + Long loanId = fromApiJsonHelper.extractLongNamed(GUARANTOR_JSON_INPUT_PARAMS.LOAN_ID.getValue(), element); + Integer guarantorTypeId = fromApiJsonHelper.extractIntegerSansLocaleNamed( + GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID.getValue(), element); + Long entityId = fromApiJsonHelper.extractLongNamed(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID.getValue(), element); + String firstname = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.FIRSTNAME.getValue(), element); + String lastname = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.LASTNAME.getValue(), element); + String addressLine1 = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_1.getValue(), element); + String addressLine2 = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.ADDRESS_LINE_2.getValue(), element); + String city = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.CITY.getValue(), element); + String state = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.STATE.getValue(), element); + String zip = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.ZIP.getValue(), element); + String country = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.COUNTRY.getValue(), element); + String mobileNumber = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.MOBILE_NUMBER.getValue(), element); + String housePhoneNumber = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.PHONE_NUMBER.getValue(), element); + String comment = fromApiJsonHelper.extractStringNamed(GUARANTOR_JSON_INPUT_PARAMS.COMMENT.getValue(), element); + LocalDate dob = fromApiJsonHelper.extractLocalDateNamed(GUARANTOR_JSON_INPUT_PARAMS.DATE_OF_BIRTH.getValue(), element); + + return new GuarantorCommand(loanId, guarantorTypeId, entityId, firstname, lastname, addressLine1, addressLine2, city, state, zip, + country, mobileNumber, housePhoneNumber, comment, dob); + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorEnumerations.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorEnumerations.java new file mode 100755 index 000000000..a4bab6afc --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorEnumerations.java @@ -0,0 +1,29 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.service; + +import java.util.ArrayList; +import java.util.List; + +import org.mifosplatform.infrastructure.core.data.EnumOptionData; +import org.mifosplatform.portfolio.loanaccount.gaurantor.domain.GuarantorType; + +public class GuarantorEnumerations { + + public static EnumOptionData guarantorType(final int id) { + return guarantorType(GuarantorType.fromInt(id)); + } + + public static EnumOptionData guarantorType(final GuarantorType guarantorType) { + EnumOptionData optionData = new EnumOptionData(guarantorType.getValue().longValue(), guarantorType.getCode(), + guarantorType.toString()); + return optionData; + } + + public static List guarantorType(GuarantorType[] guarantorTypes) { + List optionDatas = new ArrayList(); + for (GuarantorType guarantorType : guarantorTypes) { + optionDatas.add(guarantorType(guarantorType)); + } + return optionDatas; + } + +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformService.java index e4ef2c182..445fbd356 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformService.java @@ -1,13 +1,15 @@ package org.mifosplatform.portfolio.loanaccount.gaurantor.service; +import java.util.List; + import org.mifosplatform.portfolio.loanaccount.gaurantor.data.GuarantorData; public interface GuarantorReadPlatformService { - GuarantorData retrieveGuarantor(Long loanId); + List retrieveGuarantorsForLoan(Long loanId); - boolean existsGuarantor(Long loanId); + GuarantorData retrieveGuarantor(Long guarantorId); - GuarantorData getExternalGuarantor(Long loanId); + GuarantorData retrieveNewGuarantorDetails(); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformServiceImpl.java index 2ca3bdd9b..327c02ed4 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorReadPlatformServiceImpl.java @@ -1,101 +1,116 @@ package org.mifosplatform.portfolio.loanaccount.gaurantor.service; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; -import org.mifosplatform.infrastructure.dataqueries.data.GenericResultsetData; -import org.mifosplatform.infrastructure.dataqueries.service.ReadWriteNonCoreDataService; -import org.mifosplatform.portfolio.client.domain.Client; -import org.mifosplatform.portfolio.loanaccount.domain.Loan; -import org.mifosplatform.portfolio.loanaccount.domain.LoanRepository; -import org.mifosplatform.portfolio.loanaccount.exception.LoanNotFoundException; +import org.mifosplatform.infrastructure.core.data.EnumOptionData; +import org.mifosplatform.infrastructure.core.domain.JdbcSupport; +import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; +import org.mifosplatform.organisation.staff.data.StaffData; +import org.mifosplatform.organisation.staff.service.StaffReadPlatformService; +import org.mifosplatform.portfolio.client.data.ClientData; +import org.mifosplatform.portfolio.client.service.ClientReadPlatformService; import org.mifosplatform.portfolio.loanaccount.gaurantor.data.GuarantorData; -import org.mifosplatform.portfolio.loanaccount.gaurantor.exception.GuarantorNotFoundException; +import org.mifosplatform.portfolio.loanaccount.gaurantor.domain.GuarantorType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Service; @Service public class GuarantorReadPlatformServiceImpl implements GuarantorReadPlatformService { - // Table for storing external Guarantor Details - public static final String EXTERNAL_GUARANTOR_TABLE_NAME = "m_guarantor_external"; - - private final LoanRepository loanRepository; - private final ReadWriteNonCoreDataService readWriteNonCoreDataService; + private final JdbcTemplate jdbcTemplate; + private final ClientReadPlatformService clientReadPlatformService; + private final StaffReadPlatformService staffReadPlatformService; @Autowired - public GuarantorReadPlatformServiceImpl(final LoanRepository loanRepository, - final ReadWriteNonCoreDataService readWriteNonCoreDataService) { - this.loanRepository = loanRepository; - this.readWriteNonCoreDataService = readWriteNonCoreDataService; + public GuarantorReadPlatformServiceImpl(final TenantAwareRoutingDataSource dataSource, + final ClientReadPlatformService clientReadPlatformService, final StaffReadPlatformService staffReadPlatformService) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + this.clientReadPlatformService = clientReadPlatformService; + this.staffReadPlatformService = staffReadPlatformService; } - @Override - public boolean existsGuarantor(Long loanId) { - Loan loan = retrieveLoanById(loanId); - // return if internal guarantor exists - if (loan.getGuarantor() != null) { return true; } - // return if an external guarantor exists - if (null != getExternalGuarantor(loanId)) { return true; } - // else no guarantor exists - return false; - } + private static final class GuarantorMapper implements RowMapper { + public String schema() { + return " g.id as id, g.loan_id as loanId, g.entity_id as entityId, g.type_enum guarantorType ,g.firstname as firstname," + + " g.lastname as lastname, g.dob as dateOfBirth, g.address_line_1 as addressLine1, g.address_line_2 as addressLine2," + + " g.city as city, g.state as state, g.country as country, g.zip as zip, g.house_phone_number as housePhoneNumber, " + + " g.mobile_number as mobilePhoneNumber, g.comment as comment from m_guarantor g"; + } + + @Override + public GuarantorData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + Long id = rs.getLong("id"); + Long loanId = rs.getLong("loanId"); + Integer guarantorTypeId = rs.getInt("guarantorType"); + final EnumOptionData guarantorType = GuarantorEnumerations.guarantorType(guarantorTypeId); + Long entityId = rs.getLong("entityId"); + String firstname = rs.getString("firstname"); + String lastname = rs.getString("lastname"); + LocalDate dob = JdbcSupport.getLocalDate(rs, "dateOfBirth"); + String addressLine1 = rs.getString("addressLine1"); + String addressLine2 = rs.getString("addressLine2"); + String city = rs.getString("city"); + String state = rs.getString("state"); + String zip = rs.getString("zip"); + String country = rs.getString("country"); + String mobileNumber = rs.getString("mobilePhoneNumber"); + String housePhoneNumber = rs.getString("housePhoneNumber"); + String comment = rs.getString("comment"); + return new GuarantorData(id, loanId, entityId, guarantorType, firstname, lastname, dob, addressLine1, addressLine2, city, + state, zip, country, mobileNumber, housePhoneNumber, comment, null, null, null, null); + } + } + @Override - public GuarantorData retrieveGuarantor(Long loanId) { - GuarantorData guarantorData = null; - Loan loan = retrieveLoanById(loanId); - // does an internal guarantor exist - if (loan.getGuarantor() != null) { - Client guarantor = loan.getGuarantor(); - LocalDate localDate = new LocalDate(guarantor.getJoiningDate()); - guarantorData = new GuarantorData(guarantor.getId(), guarantor.getFirstName(), guarantor.getLastName(), - guarantor.getExternalId(), guarantor.getOffice().getName(), localDate); - } else { - guarantorData = getExternalGuarantor(loanId); + public List retrieveGuarantorsForLoan(Long loanId) { + final GuarantorMapper rm = new GuarantorMapper(); + String sql = "select " + rm.schema(); + sql += " where loan_id = ?"; + List guarantorDatas = this.jdbcTemplate.query(sql, rm, new Object[] { loanId }); + + List mergedGuarantorDatas = new ArrayList(); + + for (GuarantorData guarantorData : guarantorDatas) { + mergedGuarantorDatas.add(mergeDetailsForClientOrStaffGuarantor(guarantorData)); + } + return mergedGuarantorDatas; + } + + @Override + public GuarantorData retrieveGuarantor(Long guarantorId) { + final GuarantorMapper rm = new GuarantorMapper(); + String sql = "select " + rm.schema(); + sql += " where loan_id = ?"; + GuarantorData guarantorData = this.jdbcTemplate.queryForObject(sql, rm, new Object[] { guarantorId }); + + return mergeDetailsForClientOrStaffGuarantor(guarantorData); + } + + @Override + public GuarantorData retrieveNewGuarantorDetails() { + final List guarantorTypeOptions = GuarantorEnumerations.guarantorType(GuarantorType.values()); + return GuarantorData.template(guarantorTypeOptions); + } + + /** + * @param guarantorData + */ + private GuarantorData mergeDetailsForClientOrStaffGuarantor(GuarantorData guarantorData) { + if (guarantorData.isExistingClient()) { + ClientData clientData = clientReadPlatformService.retrieveIndividualClient(guarantorData.getEntityId()); + return GuarantorData.mergeClientData(clientData, guarantorData); + } else if (guarantorData.isStaffMember()) { + StaffData staffData = staffReadPlatformService.retrieveStaff(guarantorData.getEntityId()); + return GuarantorData.mergeStaffData(staffData, guarantorData); } - // throw error if guarantor does not exist - if (guarantorData == null) { throw new GuarantorNotFoundException(loanId); } return guarantorData; } - private Loan retrieveLoanById(final Long loanId) { - - // FIXME - KW - On the read side of services - we would prefer not to - // use the repository/ORM pattern - Loan loan = loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } - return loan; - } - - @Override - public GuarantorData getExternalGuarantor(final Long loanId) { - - GenericResultsetData genericResultDataSet = readWriteNonCoreDataService.retrieveDataTableGenericResultSet( - EXTERNAL_GUARANTOR_TABLE_NAME, loanId, null, null); - if (genericResultDataSet.getData().size() == 1) { - List guarantorRow = genericResultDataSet.getData().get(0).getRow(); - String firstname = guarantorRow.get(1); - String lastname = guarantorRow.get(2); - - LocalDate dateOfBirth = null; - if (!StringUtils.isBlank(guarantorRow.get(3))) { - dateOfBirth = new LocalDate(guarantorRow.get(3)); - } - String addressLine1 = guarantorRow.get(4); - String addressLine2 = guarantorRow.get(5); - String city = guarantorRow.get(6); - String state = guarantorRow.get(7); - String country = guarantorRow.get(8); - String zip = guarantorRow.get(9); - String housePhoneNumber = guarantorRow.get(10); - String mobileNumber = guarantorRow.get(11); - String comment = guarantorRow.get(12); - GuarantorData guarantorData = new GuarantorData(firstname, lastname, dateOfBirth, addressLine1, addressLine2, city, state, zip, - country, mobileNumber, housePhoneNumber, comment); - return guarantorData; - } - return null; - } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformService.java index 098e09ade..ccd8a4c06 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformService.java @@ -1,17 +1,14 @@ package org.mifosplatform.portfolio.loanaccount.gaurantor.service; -import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; -import org.springframework.security.access.prepost.PreAuthorize; +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; public interface GuarantorWritePlatformService { - @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS')") - void createGuarantor(final Long loanId, final GuarantorCommand command); + CommandProcessingResult createGuarantor(final JsonCommand command); - @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS')") - void updateGuarantor(final Long loanId, final GuarantorCommand command); + CommandProcessingResult updateGuarantor(final Long guarantorId, final JsonCommand command); - @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS')") - void removeGuarantor(final Long loanId); + CommandProcessingResult removeGuarantor(final Long guarantorId); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformServiceImpl.java deleted file mode 100644 index cc424c1e2..000000000 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformServiceImpl.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.mifosplatform.portfolio.loanaccount.gaurantor.service; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.lang.StringUtils; -import org.mifosplatform.infrastructure.core.data.ApiParameterError; -import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; -import org.mifosplatform.infrastructure.dataqueries.service.ReadWriteNonCoreDataService; -import org.mifosplatform.portfolio.client.domain.Client; -import org.mifosplatform.portfolio.client.domain.ClientRepository; -import org.mifosplatform.portfolio.client.exception.ClientNotFoundException; -import org.mifosplatform.portfolio.loanaccount.domain.Loan; -import org.mifosplatform.portfolio.loanaccount.domain.LoanRepository; -import org.mifosplatform.portfolio.loanaccount.exception.LoanNotFoundException; -import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; -import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommandValidator; -import org.mifosplatform.portfolio.loanaccount.gaurantor.exception.InvalidGuarantorException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -public class GuarantorWritePlatformServiceImpl implements GuarantorWritePlatformService { - - // Table for storing external Guarantor Details - public static final String EXTERNAL_GUARANTOR_TABLE_NAME = "m_guarantor_external"; - - private final LoanRepository loanRepository; - private final ClientRepository clientRepository; - private final ReadWriteNonCoreDataService readWriteNonCoreDataService; - private final GuarantorReadPlatformService guarantorReadPlatformService; - - @Autowired - public GuarantorWritePlatformServiceImpl(final LoanRepository loanRepository, - final ReadWriteNonCoreDataService readWriteNonCoreDataService, final ClientRepository clientRepository, - final GuarantorReadPlatformService guarantorReadPlatformService) { - this.loanRepository = loanRepository; - this.readWriteNonCoreDataService = readWriteNonCoreDataService; - this.clientRepository = clientRepository; - this.guarantorReadPlatformService = guarantorReadPlatformService; - } - - @Override - @Transactional - public void createGuarantor(final Long loanId, final GuarantorCommand command) { - GuarantorCommandValidator validator = new GuarantorCommandValidator(command); - validator.validateForCreate(); - saveOrUpdateGuarantor(loanId, command); - } - - @Override - @Transactional - public void updateGuarantor(final Long loanId, final GuarantorCommand command) { - GuarantorCommandValidator validator = new GuarantorCommandValidator(command); - validator.validateForUpdate(); - saveOrUpdateGuarantor(loanId, command); - } - - @Override - @Transactional - public void removeGuarantor(final Long loanId) { - Loan loan = retrieveLoanById(loanId); - // remove internal guarantor, if any - if (loan.getGuarantor() != null) { - loan.setGuarantor(null); - loanRepository.saveAndFlush(loan); - } - // remove external guarantor, if any - readWriteNonCoreDataService.deleteDatatableEntries(EXTERNAL_GUARANTOR_TABLE_NAME, loanId); - } - - private void saveOrUpdateGuarantor(final Long loanId, final GuarantorCommand command) { - Loan loan = retrieveLoanById(loanId); - // mark an existing client as a guarantor - if (command.isExternalGuarantor() == null || !command.isExternalGuarantor()) { - // can't set client as a guarantor to himself - if (loan.getClient().getId().equals(command.getExistingClientId())) { throw new InvalidGuarantorException( - command.getExistingClientId(), loanId); } - Client guarantor = clientRepository.findOne(command.getExistingClientId()); - if (guarantor == null) { throw new ClientNotFoundException(command.getExistingClientId()); } - loan.setGuarantor(guarantor); - this.loanRepository.saveAndFlush(loan); - // also delete any existing External Guarantors - readWriteNonCoreDataService.deleteDatatableEntries(EXTERNAL_GUARANTOR_TABLE_NAME, loanId); - }// or create an external guarantor - else { - Set modifiedParameters = command.getModifiedParameters(); - Map modifiedParametersMap = new HashMap(); - - /*** - * TODO Vishwas: Check with JW/KW if using reflection here is a good - * idea - **/ - Class guarantorCommandClass = command.getClass(); - for (String modifiedParameter : modifiedParameters) { - Method method; - try { - if (modifiedParameter.equalsIgnoreCase("externalGuarantor") || modifiedParameter.equalsIgnoreCase("existingClientId")) { - continue; - } else { - method = guarantorCommandClass.getMethod("get" + StringUtils.capitalize(modifiedParameter)); - } - String columnName = StringUtils.join(StringUtils.splitByCharacterTypeCamelCase(modifiedParameter), '_'); - modifiedParametersMap.put(columnName.toLowerCase(), method.invoke(command).toString()); - } catch (Exception e) { - // TODO: This block would ideally never be reached, could - // use an - // empty catch block instead? - List dataValidationErrors = new ArrayList(); - ApiParameterError apiParameterError = ApiParameterError.parameterError("validation.msg.validation.errors.exist", "", - modifiedParameter); - dataValidationErrors.add(apiParameterError); - throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", - "Invalid parameter passed for Creating updating Guarantor", dataValidationErrors); - } - - } - - /*** update or create a new external Guarantor entry ***/ - modifiedParametersMap.put("locale", command.getLocale()); - modifiedParametersMap.put("dateFormat", command.getDateFormat()); - if (guarantorReadPlatformService.getExternalGuarantor(loanId) != null) { -// readWriteNonCoreDataService.updateDatatableEntryOnetoOne(EXTERNAL_GUARANTOR_TABLE_NAME, loanId, modifiedParametersMap); - } else { - // FIXME - put back in call to datatable passing JsonCommand -// readWriteNonCoreDataService.newDatatableEntry(EXTERNAL_GUARANTOR_TABLE_NAME, loanId, modifiedParametersMap); - } - // finally unset any existing internal guarantors - if (loan.getGuarantor() != null) { - loan.setGuarantor(null); - this.loanRepository.saveAndFlush(loan); - } - } - } - - private Loan retrieveLoanById(final Long loanId) { - Loan loan = loanRepository.findOne(loanId); - if (loan == null) { throw new LoanNotFoundException(loanId); } - return loan; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java new file mode 100644 index 000000000..101a02c8d --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/gaurantor/service/GuarantorWritePlatformServiceJpaRepositoryIImpl.java @@ -0,0 +1,161 @@ +package org.mifosplatform.portfolio.loanaccount.gaurantor.service; + +import java.util.Map; + +import org.mifosplatform.infrastructure.core.api.JsonCommand; +import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; +import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder; +import org.mifosplatform.infrastructure.core.exception.PlatformDataIntegrityException; +import org.mifosplatform.organisation.staff.domain.Staff; +import org.mifosplatform.organisation.staff.domain.StaffRepository; +import org.mifosplatform.organisation.staff.exception.StaffNotFoundException; +import org.mifosplatform.portfolio.client.domain.Client; +import org.mifosplatform.portfolio.client.domain.ClientRepository; +import org.mifosplatform.portfolio.client.exception.ClientNotFoundException; +import org.mifosplatform.portfolio.loanaccount.domain.Loan; +import org.mifosplatform.portfolio.loanaccount.domain.LoanRepository; +import org.mifosplatform.portfolio.loanaccount.exception.LoanNotFoundException; +import org.mifosplatform.portfolio.loanaccount.gaurantor.GuarantorConstants.GUARANTOR_JSON_INPUT_PARAMS; +import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; +import org.mifosplatform.portfolio.loanaccount.gaurantor.domain.Guarantor; +import org.mifosplatform.portfolio.loanaccount.gaurantor.domain.GuarantorRepository; +import org.mifosplatform.portfolio.loanaccount.gaurantor.exception.GuarantorNotFoundException; +import org.mifosplatform.portfolio.loanaccount.gaurantor.exception.InvalidGuarantorException; +import org.mifosplatform.portfolio.loanaccount.gaurantor.serialization.GuarantorCommandFromApiJsonDeserializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class GuarantorWritePlatformServiceJpaRepositoryIImpl implements GuarantorWritePlatformService { + + private final static Logger logger = LoggerFactory.getLogger(GuarantorWritePlatformServiceJpaRepositoryIImpl.class); + + private final ClientRepository clientRepository; + private final StaffRepository staffRepository; + private final LoanRepository loanRepository; + private final GuarantorRepository guarantorRepository; + private final GuarantorCommandFromApiJsonDeserializer fromApiJsonDeserializer; + + @Autowired + public GuarantorWritePlatformServiceJpaRepositoryIImpl(final LoanRepository loanRepository, + final GuarantorRepository guarantorRepository, final ClientRepository clientRepository, final StaffRepository staffRepository, + final GuarantorCommandFromApiJsonDeserializer fromApiJsonDeserializer) { + this.loanRepository = loanRepository; + this.clientRepository = clientRepository; + this.fromApiJsonDeserializer = fromApiJsonDeserializer; + this.guarantorRepository = guarantorRepository; + this.staffRepository = staffRepository; + } + + @Override + @Transactional + public CommandProcessingResult createGuarantor(final JsonCommand command) { + try { + final GuarantorCommand guarantorCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); + guarantorCommand.validateForCreate(); + + final Long loanId = command.longValueOfParameterNamed(GUARANTOR_JSON_INPUT_PARAMS.LOAN_ID.getValue()); + Loan loan = retrieveLoanById(loanId); + Guarantor guarantor = null; + guarantor = Guarantor.fromJson(loan, command); + + validateGuarantorBusinessRules(guarantor); + + this.guarantorRepository.saveAndFlush(guarantor); + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withOfficeId(guarantor.getOfficeId()) + .withEntityId(guarantor.getId()).withLoanId(loanId).build(); + } catch (DataIntegrityViolationException dve) { + handleGuarantorDataIntegrityIssues(command, dve); + return CommandProcessingResult.empty(); + } + + } + + @Override + @Transactional + public CommandProcessingResult updateGuarantor(final Long guarantorId, final JsonCommand command) { + try { + final GuarantorCommand guarantorCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); + guarantorCommand.validateForUpdate(); + + final Guarantor guarantorForUpdate = this.guarantorRepository.findOne(guarantorId); + if (guarantorForUpdate == null) { throw new GuarantorNotFoundException(guarantorId); } + + final Map changesOnly = guarantorForUpdate.update(command); + + if (changesOnly.containsKey(GUARANTOR_JSON_INPUT_PARAMS.ENTITY_ID) + || changesOnly.containsKey(GUARANTOR_JSON_INPUT_PARAMS.GUARANTOR_TYPE_ID)) { + validateGuarantorBusinessRules(guarantorForUpdate); + } + + if (!changesOnly.isEmpty()) { + this.guarantorRepository.save(guarantorForUpdate); + } + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withOfficeId(guarantorForUpdate.getOfficeId()) + .withEntityId(guarantorForUpdate.getId()).withOfficeId(guarantorForUpdate.getLoanId()).with(changesOnly).build(); + } catch (DataIntegrityViolationException dve) { + handleGuarantorDataIntegrityIssues(command, dve); + return CommandProcessingResult.empty(); + } + } + + @Override + @Transactional + public CommandProcessingResult removeGuarantor(final Long guarantorId) { + final Guarantor guarantorForDelete = this.guarantorRepository.findOne(guarantorId); + if (guarantorForDelete == null) { throw new GuarantorNotFoundException(guarantorId); } + + this.guarantorRepository.delete(guarantorForDelete); + + return new CommandProcessingResultBuilder().withEntityId(guarantorId).withLoanId(guarantorForDelete.getLoanId()) + .withOfficeId(guarantorForDelete.getOfficeId()).build(); + } + + /** + * @param loanId + * @param loan + * @param guarantor + */ + private void validateGuarantorBusinessRules(Guarantor guarantor) { + // validate guarantor conditions + if (guarantor.isExistingCustomer()) { + // check client exists + Client client = clientRepository.findOne(guarantor.getEntityId()); + if (client == null) { throw new ClientNotFoundException(guarantor.getEntityId()); } + + // validate that the client is not set as a self guarantor + if (guarantor.getClientId().equals(guarantor.getEntityId())) { throw new InvalidGuarantorException(guarantor.getEntityId(), + guarantor.getLoanId()); } + } else if (guarantor.isExistingEmployee()) { + Staff staff = staffRepository.findOne(guarantor.getEntityId()); + if (staff == null) { throw new StaffNotFoundException(guarantor.getEntityId()); } + } + } + + private Loan retrieveLoanById(final Long loanId) { + Loan loan = loanRepository.findOne(loanId); + if (loan == null) { throw new LoanNotFoundException(loanId); } + return loan; + } + + /** + * Throws an exception for any data Integrity issue + * + * @param command + * @param dve + */ + @SuppressWarnings("unused") + private void handleGuarantorDataIntegrityIssues(final JsonCommand command, DataIntegrityViolationException dve) { + Throwable realCause = dve.getMostSpecificCause(); + logger.error(dve.getMessage(), dve); + throw new PlatformDataIntegrityException("error.msg.guarantor.unknown.data.integrity.issue", + "Unknown data integrity issue with resource Guarantor: " + realCause.getMessage()); + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java index b79764734..8c16bc41d 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformService.java @@ -19,8 +19,7 @@ public interface LoanReadPlatformService { Collection retrieveLoanTransactions(Long loanId); - LoanPermissionData retrieveLoanPermissions(LoanBasicDetailsData loanBasicDetails, boolean isWaiverAllowed, int repaymentAndWaiveCount, - boolean existsGuarantor); + LoanPermissionData retrieveLoanPermissions(LoanBasicDetailsData loanBasicDetails, boolean isWaiverAllowed, int repaymentAndWaiveCount); LoanBasicDetailsData retrieveClientAndProductDetails(Long clientId, Long productId); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index 7dc6fa151..4f7f9d2f7 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -197,7 +197,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { @Override public LoanPermissionData retrieveLoanPermissions(final LoanBasicDetailsData loanBasicDetails, final boolean isWaiverAllowed, - final int repaymentAndWaiveCount, final boolean existsGuarantor) { + final int repaymentAndWaiveCount) { final boolean pendingApproval = (loanBasicDetails.getStatus().getId().equals(100L)); final boolean waitingForDisbursal = (loanBasicDetails.getStatus().getId().equals(200L)); @@ -218,12 +218,6 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { editGuarantorAllowed = false; } - if (existsGuarantor) { - setGuarantorAllowed = false; - } else { - editGuarantorAllowed = false; - } - final boolean waiveAllowed = isWaiverAllowed && isActive; final boolean makeRepaymentAllowed = isActive; final boolean closeLoanAllowed = !closed && isActive; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/GoogleGsonPortfolioApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/GoogleGsonPortfolioApiJsonSerializerService.java index 202434522..99df375a1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/GoogleGsonPortfolioApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/GoogleGsonPortfolioApiJsonSerializerService.java @@ -6,7 +6,6 @@ import java.util.HashSet; import java.util.Set; import org.mifosplatform.infrastructure.core.serialization.GoogleGsonSerializerHelper; -import org.mifosplatform.portfolio.loanaccount.gaurantor.data.GuarantorData; import org.mifosplatform.portfolio.savingsaccount.data.SavingAccountData; import org.mifosplatform.portfolio.savingsaccount.data.SavingScheduleData; import org.mifosplatform.portfolio.savingsaccountproduct.data.SavingProductData; @@ -57,11 +56,6 @@ public class GoogleGsonPortfolioApiJsonSerializerService implements PortfolioApi "savingFrequencyOptions", "savingsInterestTypeOptions", "lockinPeriodTypeOptions", "interestCalculationOptions","permissions","savingScheduleDatas", "dueAmount", "savingScheduleData", "transactions","interestPostEvery","interestPostFrequency")); - // guarantors - private static final Set GUARANTOR_DATA_PARAMETERS = new HashSet(Arrays.asList("externalGuarantor", "existingClientId", - "firstname", "lastname", "addressLine1", "addressLine2", "city", "state", "zip", "country", "mobileNumber", "housePhoneNumber", - "comment", "dob")); - private static final Set SAVING_SCHEDULE_DATA_PARAMETERS = new HashSet(Arrays.asList("periods", "cumulativeDepositDue")); private final GoogleGsonSerializerHelper helper; @@ -134,13 +128,6 @@ public class GoogleGsonPortfolioApiJsonSerializerService implements PortfolioApi return helper.serializedJsonFrom(gsonDeserializer, accounts.toArray(new SavingAccountData[accounts.size()])); } - @Override - public String serializeGuarantorDataToJson(boolean prettyPrint, Set responseParameters, GuarantorData guarantorData) { - final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(GUARANTOR_DATA_PARAMETERS, - prettyPrint, responseParameters); - return helper.serializedJsonFrom(gsonDeserializer, guarantorData); - } - @Override public String serializeSavingScheduleDataToJson(boolean prettyPrint, Set responseParameters, SavingScheduleData savingScheduleData) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionService.java index def958eb3..d56512144 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionService.java @@ -2,7 +2,6 @@ package org.mifosplatform.portfolio.savingsaccount; import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.group.command.GroupCommand; -import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountApprovalCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountDepositCommand; @@ -38,8 +37,6 @@ public interface PortfolioApiDataConversionService { SavingAccountCommand convertJsonToSavingAccountCommand(Long resourceIdentifier, String json); - GuarantorCommand convertJsonToGuarantorCommand(Long resourceIdentifier, Long loanId, String json); - SavingStateTransitionsCommand convertJsonToSavingStateTransitionCommand(Long accountId, String json); SavingAccountApprovalCommand convertJsonToSavingApprovalCommand(Long accountId, String json); @@ -47,4 +44,5 @@ public interface PortfolioApiDataConversionService { SavingAccountDepositCommand convertJsonToSavingAccountDepositCommand(Long accountId, String json); SavingAccountWithdrawalCommand convertJsonToSavingAccountWithdrawalCommand(Long accountId, String jsonRequestBody); + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionServiceImpl.java index b11d79fde..4a90d8880 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiDataConversionServiceImpl.java @@ -25,7 +25,6 @@ import org.mifosplatform.portfolio.client.command.ClientCommand; import org.mifosplatform.portfolio.client.data.ClientData; import org.mifosplatform.portfolio.client.serialization.ClientCommandFromApiJsonDeserializer; import org.mifosplatform.portfolio.group.command.GroupCommand; -import org.mifosplatform.portfolio.loanaccount.gaurantor.command.GuarantorCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountApprovalCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountCommand; import org.mifosplatform.portfolio.savingsaccount.command.SavingAccountDepositCommand; @@ -854,51 +853,10 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo isLockinPeriodAllowed, isPartialDepositAllowed, lockinPeriod, lockinPeriodType, depositEvery, interestPostEvery, interestPostFrequency); } - @Override - public GuarantorCommand convertJsonToGuarantorCommand(Long resourceIdentifier, Long loanId, String json) { - if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } - Type typeOfMap = new TypeToken>() {}.getType(); - Map requestMap = gsonConverter.fromJson(json, typeOfMap); - - Set supportedParams = new HashSet(Arrays.asList("externalGuarantor", "existingClientId", "firstname", "lastname", - "addressLine1", "addressLine2", "city", "state", "zip", "country", "mobileNumber", "housePhoneNumber", "comment", "dob", - "locale", "dateFormat")); - - checkForUnsupportedParameters(requestMap, supportedParams); - - Set modifiedParameters = new HashSet(); - - boolean externalGuarantor = extractBooleanParameter("externalGuarantor", requestMap, modifiedParameters); - - Long existingClientId = extractLongParameter("existingClientId", requestMap, modifiedParameters); - String firstname = extractStringParameter("firstname", requestMap, modifiedParameters); - String lastname = extractStringParameter("lastname", requestMap, modifiedParameters); - String addressLine1 = extractStringParameter("addressLine1", requestMap, modifiedParameters); - String addressLine2 = extractStringParameter("addressLine2", requestMap, modifiedParameters); - String city = extractStringParameter("city", requestMap, modifiedParameters); - String state = extractStringParameter("state", requestMap, modifiedParameters); - String zip = extractStringParameter("zip", requestMap, modifiedParameters); - String country = extractStringParameter("country", requestMap, modifiedParameters); - String mobileNumber = extractStringParameter("mobileNumber", requestMap, modifiedParameters); - String housePhoneNumber = extractStringParameter("housePhoneNumber", requestMap, modifiedParameters); - String comment = extractStringParameter("comment", requestMap, modifiedParameters); - String dob = extractStringParameter("dob", requestMap, modifiedParameters); - - // workaround for passing locale info to data table api - final String dateFormat = requestMap.get("dateFormat"); - final String locale = requestMap.get("locale"); - - GuarantorCommand command = new GuarantorCommand(modifiedParameters, existingClientId, firstname, lastname, externalGuarantor, - addressLine1, addressLine2, city, state, zip, country, mobileNumber, housePhoneNumber, comment, dob); - command.setDateFormat(dateFormat); - command.setLocale(locale); - return command; - } - - @Override - public SavingStateTransitionsCommand convertJsonToSavingStateTransitionCommand( Long accountId, String json) { - + @Override + public SavingStateTransitionsCommand convertJsonToSavingStateTransitionCommand( Long accountId, String json) { + if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } Type typeOfMap = new TypeToken>() {}.getType(); @@ -914,20 +872,20 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo String note = extractStringParameter("note", requestMap, modifiedParameters); return new SavingStateTransitionsCommand(accountId, eventDate, note); - - } + + } - @Override - public SavingAccountApprovalCommand convertJsonToSavingApprovalCommand( Long accountId, String json) { - - if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } - - Type typeOfMap = new TypeToken>() {}.getType(); + @Override + public SavingAccountApprovalCommand convertJsonToSavingApprovalCommand( Long accountId, String json) { + + if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } + + Type typeOfMap = new TypeToken>() {}.getType(); Map requestMap = gsonConverter.fromJson(json, typeOfMap); Set supportedParams = new HashSet(Arrays.asList("locale", "dateFormat", "commencementDate", "savingsDepositAmountPerPeriod", - "minimumBalanceForWithdrawal", "recurringInterestRate", "savingInterestRate", "interestType", "tenure", "tenureType", "frequency", "payEvery", "note", - "interestPostEvery", "interestPostFrequency")); + "minimumBalanceForWithdrawal", "recurringInterestRate", "savingInterestRate", "interestType", "tenure", "tenureType", "frequency", "payEvery", "note", + "interestPostEvery", "interestPostFrequency")); checkForUnsupportedParameters(requestMap, supportedParams); Set modifiedParameters = new HashSet(); @@ -945,15 +903,15 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo String note = extractStringParameter("note", requestMap, modifiedParameters); Integer interestPostEvery = extractIntegerParameter("interestPostEvery", requestMap, modifiedParameters); Integer interestPostFrequency = extractIntegerParameter("interestPostFrequency", requestMap, modifiedParameters); - return new SavingAccountApprovalCommand(accountId, commencementDate, savingsDepositAmountPerPeriod, minimumBalanceForWithdrawal, recurringInterestRate, - savingInterestRate, interestType, tenure, tenureType, frequency, payEvery, note, interestPostEvery, interestPostFrequency); - } + return new SavingAccountApprovalCommand(accountId, commencementDate, savingsDepositAmountPerPeriod, minimumBalanceForWithdrawal, recurringInterestRate, + savingInterestRate, interestType, tenure, tenureType, frequency, payEvery, note, interestPostEvery, interestPostFrequency); + } - @Override - public SavingAccountDepositCommand convertJsonToSavingAccountDepositCommand(Long accountId, String json) { - if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } - - Type typeOfMap = new TypeToken>() {}.getType(); + @Override + public SavingAccountDepositCommand convertJsonToSavingAccountDepositCommand(Long accountId, String json) { + if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } + + Type typeOfMap = new TypeToken>() {}.getType(); Map requestMap = gsonConverter.fromJson(json, typeOfMap); Set supportedParams = new HashSet(Arrays.asList("locale", "dateFormat", "depositDate", "savingsDepositAmountPerPeriod", "note")); @@ -964,14 +922,14 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo LocalDate depositDate = extractLocalDateParameter("depositDate", requestMap, modifiedParameters); BigDecimal savingsDepositAmountPerPeriod = extractBigDecimalParameter("savingsDepositAmountPerPeriod", requestMap, modifiedParameters); String note = extractStringParameter("note", requestMap, modifiedParameters); - return new SavingAccountDepositCommand(accountId, savingsDepositAmountPerPeriod, depositDate, note); - } + return new SavingAccountDepositCommand(accountId, savingsDepositAmountPerPeriod, depositDate, note); + } - @Override - public SavingAccountWithdrawalCommand convertJsonToSavingAccountWithdrawalCommand(Long accountId, String json) { - if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } - - Type typeOfMap = new TypeToken>() {}.getType(); + @Override + public SavingAccountWithdrawalCommand convertJsonToSavingAccountWithdrawalCommand(Long accountId, String json) { + if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); } + + Type typeOfMap = new TypeToken>() {}.getType(); Map requestMap = gsonConverter.fromJson(json, typeOfMap); Set supportedParams = new HashSet(Arrays.asList("locale", "dateFormat", "transactionDate", "amount", "note")); @@ -982,6 +940,6 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo LocalDate transactionDate = extractLocalDateParameter("transactionDate", requestMap, modifiedParameters); BigDecimal amount = extractBigDecimalParameter("amount", requestMap, modifiedParameters); String note = extractStringParameter("note", requestMap, modifiedParameters); - return new SavingAccountWithdrawalCommand(accountId, transactionDate, amount, note); - } + return new SavingAccountWithdrawalCommand(accountId, transactionDate, amount, note); + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiJsonSerializerService.java index d82b47cbe..5b50e5722 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/savingsaccount/PortfolioApiJsonSerializerService.java @@ -3,7 +3,6 @@ package org.mifosplatform.portfolio.savingsaccount; import java.util.Collection; import java.util.Set; -import org.mifosplatform.portfolio.loanaccount.gaurantor.data.GuarantorData; import org.mifosplatform.portfolio.savingsaccount.data.SavingAccountData; import org.mifosplatform.portfolio.savingsaccount.data.SavingScheduleData; import org.mifosplatform.portfolio.savingsaccountproduct.data.SavingProductData; @@ -28,8 +27,6 @@ public interface PortfolioApiJsonSerializerService { String serializeSavingAccountsDataToJson(boolean prettyPrint, Set responseParameters, Collection accounts); - String serializeGuarantorDataToJson(boolean prettyPrint, Set responseParameters, GuarantorData guarantorData); - String serializeSavingScheduleDataToJson(boolean prettyPrint, Set responseParameters, SavingScheduleData savingScheduleData); } \ No newline at end of file