From 2a772b18eb2b80387ac850d86278f5a535fbceac Mon Sep 17 00:00:00 2001 From: ShruthiRajaram Date: Fri, 2 Nov 2018 16:03:12 +0530 Subject: [PATCH 1/3] FINERACT-656 and FINERACT-655 unable to import client via bulk import when address is enabled --- .../client/ClientEntityImportHandler.java | 23 +++++-- .../client/ClientPersonImportHandler.java | 26 +++++--- .../portfolio/address/data/AddressData.java | 2 + .../AddressWritePlatformServiceImpl.java | 66 ++++++++++--------- .../portfolio/client/data/ClientData.java | 19 +++--- .../client/data/ClientDataValidator.java | 16 ++++- .../ClientReadPlatformServiceImpl.java | 15 +++-- 7 files changed, 100 insertions(+), 67 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java index 36fb4cdb8..28ab011df 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientEntityImportHandler.java @@ -18,7 +18,11 @@ */ package org.apache.fineract.infrastructure.bulkimport.importhandler.client; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -29,17 +33,19 @@ import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.infrastructure.core.exception.*; import org.apache.fineract.portfolio.address.data.AddressData; import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.data.ClientNonPersonData; -import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.joda.time.LocalDate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; +import com.google.gson.GsonBuilder; @Service public class ClientEntityImportHandler implements ImportHandler { @@ -134,6 +140,7 @@ public class ClientEntityImportHandler implements ImportHandler { activationDate=submittedOn; } AddressData addressDataObj=null; + Collection addressList = null; if (ImportHandlerUtils.readAsBoolean(ClientEntityConstants.ADDRESS_ENABLED,row)) { String addressType = ImportHandlerUtils.readAsString(ClientEntityConstants.ADDRESS_TYPE_COL, row); Long addressTypeId = null; @@ -167,10 +174,12 @@ public class ClientEntityImportHandler implements ImportHandler { } addressDataObj = new AddressData(addressTypeId, street, addressLine1, addressLine2, addressLine3, city, postalCode, isActiveAddress, stateProvinceId, countryId); + addressList = new ArrayList(Arrays.asList(addressDataObj)); } return ClientData.importClientEntityInstance(legalFormId,row.getRowNum(),name,officeId,clientTypeId,clientClassicationId, - staffId,active,activationDate,submittedOn, externalId,incorportionDate,mobileNo,clientNonPersonData,addressDataObj,locale,dateFormat); - } + staffId, active, activationDate, submittedOn, externalId, incorportionDate, mobileNo, + clientNonPersonData, addressList, locale, dateFormat); + } public Count importEntity(String dateFormat) { Sheet clientSheet=workbook.getSheet(TemplatePopulateImportConstants.CLIENT_ENTITY_SHEET_NAME); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java index 34e0fae47..1e828c102 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/client/ClientPersonImportHandler.java @@ -18,7 +18,11 @@ */ package org.apache.fineract.infrastructure.bulkimport.importhandler.client; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -28,17 +32,18 @@ import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.infrastructure.core.exception.*; import org.apache.fineract.portfolio.address.data.AddressData; import org.apache.fineract.portfolio.client.data.ClientData; -import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.joda.time.LocalDate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; +import com.google.gson.GsonBuilder; @Service public class ClientPersonImportHandler implements ImportHandler { @@ -120,6 +125,7 @@ public class ClientPersonImportHandler implements ImportHandler { Boolean isStaff = ImportHandlerUtils.readAsBoolean(ClientPersonConstants.IS_STAFF_COL, row); AddressData addressDataObj=null; + Collection addressList = null; if (ImportHandlerUtils.readAsBoolean(ClientPersonConstants.ADDRESS_ENABLED_COL,row)) { String addressType=ImportHandlerUtils.readAsString(ClientPersonConstants.ADDRESS_TYPE_COL, row); Long addressTypeId = null; @@ -154,11 +160,13 @@ public class ClientPersonImportHandler implements ImportHandler { } addressDataObj = new AddressData(addressTypeId, street, addressLine1, addressLine2, addressLine3, city, postalCode, isActiveAddress, stateProvinceId, countryId); + addressList = new ArrayList(Arrays.asList(addressDataObj)); } return ClientData.importClientPersonInstance(legalFormId,row.getRowNum(),firstName,lastName,middleName,submittedOn,activationDate,active,externalId, - officeId,staffId,mobileNo,dob,clientTypeId,genderId,clientClassicationId,isStaff,addressDataObj,locale,dateFormat); + officeId, staffId, mobileNo, dob, clientTypeId, genderId, clientClassicationId, isStaff, + addressList, locale, dateFormat); - } + } public Count importEntity(String dateFormat) { Sheet clientSheet=workbook.getSheet(TemplatePopulateImportConstants.CLIENT_PERSON_SHEET_NAME); @@ -174,7 +182,7 @@ public class ClientPersonImportHandler implements ImportHandler { .createClient() // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = clientSheet.getRow(client.getRowIndex()).createCell(ClientPersonConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java index 61bd88946..d4de82bbe 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java @@ -24,7 +24,9 @@ import java.util.Date; import org.apache.fineract.infrastructure.codes.data.CodeValueData; +@SuppressWarnings("unused") public class AddressData { + private final Long client_id; private final String addressType; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java index 913ad2b01..b552c2518 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java @@ -115,42 +115,44 @@ public class AddressWritePlatformServiceImpl implements AddressWritePlatformServ long countryId; ClientAddress clientAddressobj = new ClientAddress(); final JsonArray addressArray = command.arrayOfParameterNamed("address"); + + if(addressArray != null){ + for (int i = 0; i < addressArray.size(); i++) { + final JsonObject jsonObject = addressArray.get(i).getAsJsonObject(); - for (int i = 0; i < addressArray.size(); i++) { - final JsonObject jsonObject = addressArray.get(i).getAsJsonObject(); + // validate every address + this.fromApiJsonDeserializer.validateForCreate(jsonObject.toString(), true); - // validate every address - this.fromApiJsonDeserializer.validateForCreate(jsonObject.toString(), true); + if (jsonObject.get("stateProvinceId") != null) { + stateId = jsonObject.get("stateProvinceId").getAsLong(); + stateIdobj = this.codeValueRepository.getOne(stateId); + } + + if (jsonObject.get("countryId") != null) { + countryId = jsonObject.get("countryId").getAsLong(); + countryIdObj = this.codeValueRepository.getOne(countryId); + } + + final long addressTypeId = jsonObject.get("addressTypeId").getAsLong(); + final CodeValue addressTypeIdObj = this.codeValueRepository.getOne(addressTypeId); + + final Address add = Address.fromJsonObject(jsonObject, stateIdobj, countryIdObj); + this.addressRepository.save(add); + final Long addressid = add.getId(); + final Address addobj = this.addressRepository.getOne(addressid); + + //final boolean isActive = jsonObject.get("isActive").getAsBoolean(); + boolean isActive=false; + if(jsonObject.get("isActive")!= null) + { + isActive= jsonObject.get("isActive").getAsBoolean(); + } + + + clientAddressobj = ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj); + this.clientAddressRepository.save(clientAddressobj); - if (jsonObject.get("stateProvinceId") != null) { - stateId = jsonObject.get("stateProvinceId").getAsLong(); - stateIdobj = this.codeValueRepository.getOne(stateId); } - - if (jsonObject.get("countryId") != null) { - countryId = jsonObject.get("countryId").getAsLong(); - countryIdObj = this.codeValueRepository.getOne(countryId); - } - - final long addressTypeId = jsonObject.get("addressTypeId").getAsLong(); - final CodeValue addressTypeIdObj = this.codeValueRepository.getOne(addressTypeId); - - final Address add = Address.fromJsonObject(jsonObject, stateIdobj, countryIdObj); - this.addressRepository.save(add); - final Long addressid = add.getId(); - final Address addobj = this.addressRepository.getOne(addressid); - - //final boolean isActive = jsonObject.get("isActive").getAsBoolean(); - boolean isActive=false; - if(jsonObject.get("isActive")!= null) - { - isActive= jsonObject.get("isActive").getAsBoolean(); - } - - - clientAddressobj = ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj); - this.clientAddressRepository.save(clientAddressobj); - } return new CommandProcessingResultBuilder().withCommandId(command.commandId()) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java index 96f136db6..c25730569 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java @@ -21,12 +21,10 @@ package org.apache.fineract.portfolio.client.data; import java.util.Collection; import java.util.List; - import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.CompareToBuilder; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; -import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants; import org.apache.fineract.infrastructure.codes.data.CodeValueData; import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.dataqueries.data.DatatableData; @@ -41,6 +39,7 @@ import org.joda.time.LocalDate; /** * Immutable data object representing client data. */ +@SuppressWarnings("unused") final public class ClientData implements Comparable { private final Long id; @@ -50,7 +49,6 @@ final public class ClientData implements Comparable { private final EnumOptionData status; private final CodeValueData subStatus; - @SuppressWarnings("unused") private final Boolean active; private final LocalDate activationDate; @@ -103,11 +101,12 @@ final public class ClientData implements Comparable { private final ClientNonPersonData clientNonPersonDetails; - private final AddressData address; + private final Collection address; private final Boolean isAddressEnabled; - private final List datatables; + + private final List datatables; //import fields private transient Integer rowIndex; @@ -122,7 +121,7 @@ final public class ClientData implements Comparable { public static ClientData importClientEntityInstance(Long legalFormId,Integer rowIndex,String fullname,Long officeId, Long clientTypeId, Long clientClassificationId,Long staffId,Boolean active,LocalDate activationDate,LocalDate submittedOnDate, String externalId,LocalDate dateOfBirth,String mobileNo,ClientNonPersonData clientNonPersonDetails, - AddressData address,String locale,String dateFormat){ + Collection address,String locale,String dateFormat){ return new ClientData(legalFormId,rowIndex,fullname, null, null, null, submittedOnDate,activationDate,active, externalId, officeId, staffId,mobileNo,dateOfBirth,clientTypeId, null,clientClassificationId,null, address,clientNonPersonDetails, locale,dateFormat); @@ -131,7 +130,7 @@ final public class ClientData implements Comparable { public static ClientData importClientPersonInstance(Long legalFormId,Integer rowIndex,String firstName,String lastName,String middleName, LocalDate submittedOn,LocalDate activationDate,Boolean active,String externalId,Long officeId, Long staffId,String mobileNo, LocalDate dob,Long clientTypeId,Long genderId, - Long clientClassificationId, Boolean isStaff, AddressData address,String locale,String dateFormat){ + Long clientClassificationId, Boolean isStaff, Collection address,String locale,String dateFormat){ return new ClientData(legalFormId,rowIndex, null, firstName,lastName,middleName,submittedOn,activationDate,active,externalId, officeId,staffId,mobileNo,dob,clientTypeId,genderId,clientClassificationId,isStaff,address, null, locale,dateFormat); @@ -144,7 +143,7 @@ final public class ClientData implements Comparable { private ClientData(Long legalFormId,Integer rowIndex, String fullname, String firstname,String lastname,String middlename, LocalDate submittedOn,LocalDate activationDate,Boolean active,String externalId,Long officeId, Long staffId,String mobileNo, LocalDate dob,Long clientTypeId,Long genderId, - Long clientClassificationId,Boolean isStaff, AddressData address, ClientNonPersonData clientNonPersonDetails, + Long clientClassificationId,Boolean isStaff, Collection address, ClientNonPersonData clientNonPersonDetails, String locale,String dateFormat ) { this.rowIndex=rowIndex; this.dateFormat=dateFormat; @@ -225,7 +224,7 @@ final public class ClientData implements Comparable { final Collection staffOptions, final Collection narrations, final Collection genderOptions, final Collection savingProductOptions, final Collection clientTypeOptions, final Collection clientClassificationOptions, final Collection clientNonPersonConstitutionOptions, - final Collection clientNonPersonMainBusinessLineOptions, final List clientLegalFormOptions,final ClientFamilyMembersData familyMemberOptions, final AddressData address, + final Collection clientNonPersonMainBusinessLineOptions, final List clientLegalFormOptions,final ClientFamilyMembersData familyMemberOptions, final Collection address, final Boolean isAddressEnabled, final List datatables) { final String accountNo = null; final EnumOptionData status = null; @@ -456,7 +455,7 @@ final public class ClientData implements Comparable { final CodeValueData clientClassification, final Collection clientTypeOptions, final Collection clientClassificationOptions, final Collection clientNonPersonConstitutionOptions, final Collection clientNonPersonMainBusinessLineOptions, final ClientNonPersonData clientNonPerson, - final List clientLegalFormOptions,final ClientFamilyMembersData familyMemberOptions, final EnumOptionData legalForm, final AddressData address, + final List clientLegalFormOptions,final ClientFamilyMembersData familyMemberOptions, final EnumOptionData legalForm, final Collection address, final Boolean isAddressEnabled, final List datatables, final Boolean isStaff) { this.accountNo = accountNo; this.status = status; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java index 7af776ef5..ffa1dadb9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java @@ -29,6 +29,8 @@ import java.util.Set; import com.google.gson.JsonArray; import org.apache.commons.lang.StringUtils; +import org.apache.fineract.infrastructure.configuration.data.GlobalConfigurationPropertyData; +import org.apache.fineract.infrastructure.configuration.service.ConfigurationReadPlatformService; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; @@ -49,11 +51,14 @@ import com.google.gson.reflect.TypeToken; public final class ClientDataValidator { private final FromJsonHelper fromApiJsonHelper; + private final ConfigurationReadPlatformService configurationReadPlatformService; @Autowired - public ClientDataValidator(final FromJsonHelper fromApiJsonHelper) { + public ClientDataValidator(final FromJsonHelper fromApiJsonHelper, + final ConfigurationReadPlatformService configurationReadPlatformService) { this.fromApiJsonHelper = fromApiJsonHelper; - } + this.configurationReadPlatformService = configurationReadPlatformService; + } public void validateForCreate(final String json) { @@ -217,6 +222,13 @@ public final class ClientDataValidator { baseDataValidator.reset().parameter("isStaff").value(isStaffFlag).notNull(); } + + if(this.configurationReadPlatformService + .retrieveGlobalConfiguration("Enable-Address").isEnabled()){ + final JsonArray address =this.fromApiJsonHelper.extractJsonArrayNamed(ClientApiConstants.address, element); + baseDataValidator.reset().parameter(ClientApiConstants.address).value(address).notNull().jsonArrayNotEmpty(); + } + List dataValidationErrorsForClientNonPerson = getDataValidationErrorsForCreateOnClientNonPerson(element.getAsJsonObject().get(ClientApiConstants.clientNonPersonDetailsParamName)); dataValidationErrors.addAll(dataValidationErrorsForClientNonPerson); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java index 4b1313b44..9d1babd8a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientReadPlatformServiceImpl.java @@ -169,8 +169,9 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService return ClientData.template(defaultOfficeId, new LocalDate(), offices, staffOptions, null, genderOptions, savingsProductDatas, clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, - clientLegalFormOptions,familyMemberOptions,address,isAddressEnabled, datatableTemplates); - } + clientLegalFormOptions, familyMemberOptions, new ArrayList(Arrays.asList(address)), + isAddressEnabled, datatableTemplates); + } @Override // @Transactional(readOnly=true) @@ -427,7 +428,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } @Override - public ClientData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + public ClientData mapRow(final ResultSet rs, final int rowNum) throws SQLException { final String accountNo = rs.getString("accountNo"); @@ -612,7 +613,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } @Override - public ClientData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + public ClientData mapRow(final ResultSet rs, final int rowNum) throws SQLException { final String accountNo = rs.getString("accountNo"); @@ -714,7 +715,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } @Override - public GroupGeneralData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + public GroupGeneralData mapRow(final ResultSet rs, final int rowNum) throws SQLException { final Long groupId = JdbcSupport.getLong(rs, "groupId"); final String groupName = rs.getString("groupName"); @@ -744,7 +745,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } @Override - public ClientData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + public ClientData mapRow(final ResultSet rs, final int rowNum) throws SQLException { final Long id = rs.getLong("id"); final String displayName = rs.getString("displayName"); @@ -778,7 +779,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService } @Override - public ClientData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + public ClientData mapRow(final ResultSet rs, final int rowNum) throws SQLException { final Long id = rs.getLong("id"); final String accountNo = rs.getString("accountNo"); From 15cb800609b87a9e51cfc141abe6ea9b1e48abb9 Mon Sep 17 00:00:00 2001 From: ShruthiRajaram Date: Wed, 7 Nov 2018 15:53:17 +0530 Subject: [PATCH 2/3] FINERACT-659 Account Id issue while importing bulk loan transaction --- .../LoanRepaymentImportHandler.java | 32 +++++++++++-------- .../LoanRepaymentWorkbookPopulator.java | 2 +- .../loanaccount/data/LoanTransactionData.java | 14 ++++---- .../service/LoanReadPlatformService.java | 2 ++ .../service/LoanReadPlatformServiceImpl.java | 13 +++++++- 5 files changed, 40 insertions(+), 23 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java index 8134bc666..c5417e3c0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/importhandler/loanrepayment/LoanRepaymentImportHandler.java @@ -18,8 +18,10 @@ */ package org.apache.fineract.infrastructure.bulkimport.importhandler.loanrepayment; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -29,28 +31,32 @@ import org.apache.fineract.infrastructure.bulkimport.data.Count; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandler; import org.apache.fineract.infrastructure.bulkimport.importhandler.ImportHandlerUtils; import org.apache.fineract.infrastructure.bulkimport.importhandler.helper.DateSerializer; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.infrastructure.core.exception.*; import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData; -import org.apache.poi.ss.usermodel.*; +import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.joda.time.LocalDate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; @Service public class LoanRepaymentImportHandler implements ImportHandler { private Workbook workbook; private List loanRepayments; - private Integer loanAccountId; + private Long loanAccountId; + private final LoanReadPlatformService loanReadPlatformService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; @Autowired public LoanRepaymentImportHandler(final PortfolioCommandSourceWritePlatformService - commandsSourceWritePlatformService) { + commandsSourceWritePlatformService, final LoanReadPlatformService loanReadPlatformService) { this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; + this.loanReadPlatformService = loanReadPlatformService; } @Override @@ -75,7 +81,7 @@ public class LoanRepaymentImportHandler implements ImportHandler { String loanaccountInfo=ImportHandlerUtils.readAsString(LoanRepaymentConstants.LOAN_ACCOUNT_NO_COL, row); if (loanaccountInfo!=null){ String loanAccountAr[]=loanaccountInfo.split("-"); - loanAccountId=Integer.parseInt(loanAccountAr[0]); + loanAccountId = this.loanReadPlatformService.retrieveLoanIdByAccountNumber(loanAccountAr[0]); } BigDecimal repaymentAmount=null; if (ImportHandlerUtils.readAsDouble(LoanRepaymentConstants.AMOUNT_COL, row)!=null) @@ -107,10 +113,10 @@ public class LoanRepaymentImportHandler implements ImportHandler { loanRepaymentJsonob.remove("manuallyReversed"); String payload=loanRepaymentJsonob.toString(); final CommandWrapper commandRequest = new CommandWrapperBuilder() // - .loanRepaymentTransaction(loanRepayment.getAccountId().longValue()) // + .loanRepaymentTransaction(loanRepayment.getAccountId()) // .withJson(payload) // .build(); // - final CommandProcessingResult result = commandsSourceWritePlatformService.logCommandSource(commandRequest); + commandsSourceWritePlatformService.logCommandSource(commandRequest); successCount++; Cell statusCell = loanRepaymentSheet.getRow(loanRepayment.getRowIndex()).createCell(LoanRepaymentConstants.STATUS_COL); statusCell.setCellValue(TemplatePopulateImportConstants.STATUS_CELL_IMPORTED); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java index 04646fbcc..fe3e8c575 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/populator/loanrepayment/LoanRepaymentWorkbookPopulator.java @@ -213,7 +213,7 @@ public class LoanRepaymentWorkbookPopulator extends AbstractWorkbookPopulator { row = loanRepaymentSheet.createRow(rowIndex++); writeString(LoanRepaymentConstants.LOOKUP_CLIENT_NAME_COL, row, loan.getClientName() + "(" + loan.getClientId() + ")"); writeString(LoanRepaymentConstants.LOOKUP_CLIENT_EXTERNAL_ID,row, clientIdToClientExternalId.get(loan.getClientId())); - writeString(LoanRepaymentConstants.LOOKUP_ACCOUNT_NO_COL, row, Long.parseLong(loan.getAccountNo())+"-"+loan.getStatusStringValue()); + writeString(LoanRepaymentConstants.LOOKUP_ACCOUNT_NO_COL, row, loan.getAccountNo()+"-"+loan.getStatusStringValue()); writeString(LoanRepaymentConstants.LOOKUP_PRODUCT_COL, row, loan.getLoanProductName()); writeDouble(LoanRepaymentConstants.LOOKUP_PRINCIPAL_COL, row, loan.getPrincipal().doubleValue()); if (loan.getDisbursementDate() != null) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java index e3424fa88..7b6501769 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/data/LoanTransactionData.java @@ -21,7 +21,6 @@ package org.apache.fineract.portfolio.loanaccount.data; import java.math.BigDecimal; import java.util.Collection; -import org.apache.fineract.infrastructure.bulkimport.constants.TemplatePopulateImportConstants; import org.apache.fineract.infrastructure.codes.data.CodeValueData; import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.portfolio.account.data.AccountTransferData; @@ -32,6 +31,7 @@ import org.joda.time.LocalDate; /** * Immutable data object representing a loan transaction. */ +@SuppressWarnings("unused") public class LoanTransactionData { private final Long id; @@ -56,16 +56,14 @@ public class LoanTransactionData { private final AccountTransferData transfer; private final BigDecimal fixedEmiAmount; private final BigDecimal outstandingLoanBalance; - @SuppressWarnings("unused") private final LocalDate submittedOnDate; private final boolean manuallyReversed; - @SuppressWarnings("unused") private final LocalDate possibleNextRepaymentDate; // templates final Collection paymentTypeOptions; - private Collection writeOffReasonOptions = null; + private Collection writeOffReasonOptions = null; //import fields private transient Integer rowIndex; @@ -79,7 +77,7 @@ public class LoanTransactionData { private Integer routingCode; private Integer receiptNumber; private Integer bankNumber; - private transient Integer accountId; + private transient Long accountId; private transient String transactionType; public static LoanTransactionData importInstance(BigDecimal repaymentAmount,LocalDate lastRepaymentDate, @@ -120,7 +118,7 @@ public class LoanTransactionData { } public static LoanTransactionData importInstance(BigDecimal repaymentAmount,LocalDate repaymentDate, Long repaymentTypeId, String accountNumber,Integer checkNumber,Integer routingCode, - Integer receiptNumber, Integer bankNumber,Integer loanAccountId,String transactionType, + Integer receiptNumber, Integer bankNumber,Long loanAccountId,String transactionType, Integer rowIndex,String locale, String dateFormat){ return new LoanTransactionData(repaymentAmount, repaymentDate, repaymentTypeId, accountNumber, checkNumber, routingCode, receiptNumber, bankNumber, loanAccountId, "", @@ -129,7 +127,7 @@ public class LoanTransactionData { private LoanTransactionData(BigDecimal transactionAmount,LocalDate transactionDate, Long paymentTypeId, String accountNumber,Integer checkNumber,Integer routingCode,Integer receiptNumber, - Integer bankNumber,Integer accountId,String transactionType,Integer rowIndex,String locale, + Integer bankNumber,Long accountId,String transactionType,Integer rowIndex,String locale, String dateFormat) { this.transactionAmount = transactionAmount; this.transactionDate = transactionDate; @@ -169,7 +167,7 @@ public class LoanTransactionData { this.writeOffReasonOptions = null; } - public Integer getAccountId() { + public Long getAccountId() { return accountId; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java index 73f41cfdc..e205fbf19 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java @@ -132,4 +132,6 @@ public interface LoanReadPlatformService { LoanTransactionData retrieveLoanForeclosureTemplate(final Long loanId, final LocalDate transactionDate); LoanAccountData retrieveLoanByLoanAccount(String loanAccountNumber); + + Long retrieveLoanIdByAccountNumber(String loanAccountNumber); } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java index edf543cdd..e2464d83b 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -2197,5 +2197,16 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } } - + + @Override + public Long retrieveLoanIdByAccountNumber(String loanAccountNumber) { + try { + return this.jdbcTemplate.queryForObject("select l.id from m_loan l where l.account_no = ?", + new Object[] { loanAccountNumber }, Long.class); + + } catch (final EmptyResultDataAccessException e) { + return null; + } + } + } From 0888d8bd36918d6b3f14eec2b8523bbac0649ed8 Mon Sep 17 00:00:00 2001 From: ShruthiRajaram Date: Thu, 8 Nov 2018 18:24:22 +0530 Subject: [PATCH 3/3] FINERACT-662 activation date null check --- .../org/apache/fineract/portfolio/group/domain/Group.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java index a40aad7e8..b0874ce7d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/domain/Group.java @@ -46,10 +46,10 @@ import org.apache.commons.lang.StringUtils; import org.apache.fineract.infrastructure.codes.domain.CodeValue; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.infrastructure.core.service.DateUtils; -import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.apache.fineract.infrastructure.security.service.RandomPasswordGenerator; import org.apache.fineract.organisation.office.domain.Office; import org.apache.fineract.organisation.staff.domain.Staff; @@ -334,7 +334,9 @@ public final class Group extends AbstractPersistableCustom { actualChanges.put(GroupingTypesApiConstants.localeParamName, localeAsInput); final LocalDate newValue = command.localDateValueOfParameterNamed(GroupingTypesApiConstants.activationDateParamName); - this.activationDate = newValue.toDate(); + if (newValue != null) { + this.activationDate = newValue.toDate(); + } } if (command.isChangeInStringParameterNamed(GroupingTypesApiConstants.accountNoParamName, this.accountNumber)) {