diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index 8a952ddae..acdc7e66d 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -15735,6 +15735,16 @@ GET https://DomainName/api/v1/accountnumberformats/template "id": 3, "code": "accountType.savings", "value": "SAVINGS" + }, + { + "id": 4, + "code": "accountType.center", + "value": "CENTER" + }, + { + "id": 5, + "code": "accountType.group", + "value": "GROUP" } ], "prefixTypeOptions": @@ -15777,6 +15787,22 @@ GET https://DomainName/api/v1/accountnumberformats/template "code": "accountNumberPrefixType.officeName", "value": "OFFICE_NAME" } + ], + "accountType.center": + [ + { + "id": 1, + "code": "accountNumberPrefixType.officeName", + "value": "OFFICE_NAME" + } + ], + "accountType.group": + [ + { + "id": 1, + "code": "accountNumberPrefixType.officeName", + "value": "OFFICE_NAME" + }, ] } } diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/AccountNumberPreferencesTest.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/AccountNumberPreferencesTest.java index 0bec1262b..82b0d2dca 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/AccountNumberPreferencesTest.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/AccountNumberPreferencesTest.java @@ -5,14 +5,19 @@ */ package org.mifosplatform.integrationtests; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.mifosplatform.integrationtests.common.CenterDomain; +import org.mifosplatform.integrationtests.common.CenterHelper; import org.mifosplatform.integrationtests.common.ClientHelper; import org.mifosplatform.integrationtests.common.CommonConstants; +import org.mifosplatform.integrationtests.common.GroupHelper; +import org.mifosplatform.integrationtests.common.OfficeHelper; import org.mifosplatform.integrationtests.common.Utils; import org.mifosplatform.integrationtests.common.loans.LoanApplicationTestBuilder; import org.mifosplatform.integrationtests.common.loans.LoanProductTestBuilder; @@ -53,6 +58,8 @@ public class AccountNumberPreferencesTest { private Integer clientAccountNumberPreferenceId; private Integer loanAccountNumberPreferenceId; private Integer savingsAccountNumberPreferenceId; + private Integer groupsAccountNumberPreferenceId; + private Integer centerAccountNumberPreferenceId; private final String MINIMUM_OPENING_BALANCE = "1000.0"; private final String ACCOUNT_TYPE_INDIVIDUAL = "INDIVIDUAL"; private Boolean isAccountPreferenceSetUp = false; @@ -63,7 +70,10 @@ public class AccountNumberPreferencesTest { private final String officeName = "OFFICE_NAME"; private final String loanShortName = "LOAN_PRODUCT_SHORT_NAME"; private final String savingsShortName = "SAVINGS_PRODUCT_SHORT_NAME"; - + private Integer groupID; + private Integer centerId; + private String groupAccountNo; + @Before public void setup() { Utils.initializeRESTAssured(); @@ -143,6 +153,8 @@ public class AccountNumberPreferencesTest { this.createAndValidateClientEntity(this.isAccountPreferenceSetUp); this.createAndValidateLoanEntity(this.isAccountPreferenceSetUp); this.createAndValidateSavingsEntity(this.isAccountPreferenceSetUp); + this.createAndValidateGroup(this.isAccountPreferenceSetUp); + this.createAndValidateCenter(this.isAccountPreferenceSetUp); } private void validateAccountNumberGenerationWithPreferences() { @@ -150,6 +162,8 @@ public class AccountNumberPreferencesTest { this.createAndValidateClientEntity(this.isAccountPreferenceSetUp); this.createAndValidateLoanEntity(this.isAccountPreferenceSetUp); this.createAndValidateSavingsEntity(this.isAccountPreferenceSetUp); + this.createAndValidateGroup(this.isAccountPreferenceSetUp); + this.createAndValidateCenter(this.isAccountPreferenceSetUp); } private void createAccountNumberPreference() { @@ -164,9 +178,18 @@ public class AccountNumberPreferencesTest { this.savingsAccountNumberPreferenceId = (Integer) this.accountNumberPreferencesHelper.createSavingsAccountNumberPreference( this.responseSpec, "resourceId"); System.out.println("Successfully created account number preferences for Savings (ID: " + this.savingsAccountNumberPreferenceId); + + this.groupsAccountNumberPreferenceId = (Integer) this.accountNumberPreferencesHelper.createGroupsAccountNumberPreference( + this.responseSpec, "resourceId"); + System.out.println("Successfully created account number preferences for Groups (ID: " + this.groupsAccountNumberPreferenceId); + + this.centerAccountNumberPreferenceId = (Integer) this.accountNumberPreferencesHelper.createCenterAccountNumberPreference( + this.responseSpec, "resourceId"); + System.out.println("Successfully created account number preferences for Center (ID: " + this.centerAccountNumberPreferenceId); this.accountNumberPreferencesHelper.verifyCreationOfAccountNumberPreferences(this.clientAccountNumberPreferenceId, - this.loanAccountNumberPreferenceId, this.savingsAccountNumberPreferenceId, this.responseSpec, this.requestSpec); + this.loanAccountNumberPreferenceId, this.savingsAccountNumberPreferenceId, this.groupsAccountNumberPreferenceId, + this.centerAccountNumberPreferenceId, this.responseSpec, this.requestSpec); this.createAccountNumberPreferenceInvalidData("1000", "1001"); this.createAccountNumberPreferenceDuplicateData("1", "101"); @@ -242,6 +265,58 @@ public class AccountNumberPreferencesTest { this.createAndValidateClientWithoutAccountPreference(); } } + + private void createAndValidateGroup(Boolean isAccountPreferenceSetUp) { + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.groupID = GroupHelper.createGroup(this.requestSpec, this.responseSpec); + GroupHelper.verifyGroupCreatedOnServer(this.requestSpec, this.responseSpec, groupID); + + this.groupID = GroupHelper.activateGroup(this.requestSpec, this.responseSpec, groupID.toString()); + GroupHelper.verifyGroupActivatedOnServer(this.requestSpec, this.responseSpec, groupID, true); + + final String GROUP_URL = "/mifosng-provider/api/v1/groups/" + this.groupID + "?" + Utils.TENANT_IDENTIFIER; + this.groupAccountNo = Utils.performServerGet(requestSpec, responseSpec, GROUP_URL, "accountNo"); + + if (isAccountPreferenceSetUp) { + String groupsPrefixName = (String) this.accountNumberPreferencesHelper.getAccountNumberPreference( + this.groupsAccountNumberPreferenceId, "prefixType.value"); + + if (groupsPrefixName.equals(this.officeName)) { + + final String groupOfficeName = Utils.performServerGet(requestSpec, responseSpec, GROUP_URL, "officeName"); + + this.validateAccountNumberLengthAndStartsWithPrefix(this.groupAccountNo, groupOfficeName); + } + } else { + validateAccountNumberLengthAndStartsWithPrefix(this.groupAccountNo, null); + } + } + + private void createAndValidateCenter(Boolean isAccountPreferenceSetUp) { + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + Integer officeId = new OfficeHelper(requestSpec, responseSpec).createOffice("01 July 2007"); + + String name = "CenterCreation" + new Timestamp(new java.util.Date().getTime()); + this.centerId = CenterHelper.createCenter(name, officeId, requestSpec, responseSpec); + CenterDomain center = CenterHelper.retrieveByID(centerId, requestSpec, responseSpec); + Assert.assertNotNull(center); + Assert.assertTrue(center.getName().equals(name)); + + if (isAccountPreferenceSetUp) { + String centerPrefixName = (String) this.accountNumberPreferencesHelper.getAccountNumberPreference( + this.centerAccountNumberPreferenceId, "prefixType.value"); + final String CENTER_URL = "/mifosng-provider/api/v1/groups/" + this.centerId + "?" + Utils.TENANT_IDENTIFIER; + + if (centerPrefixName.equals(this.officeName)) { + final String centerOfficeName = Utils.performServerGet(requestSpec, responseSpec, CENTER_URL, "officeName"); + + this.validateAccountNumberLengthAndStartsWithPrefix(center.getAccountNo(), centerOfficeName); + } + } else { + validateAccountNumberLengthAndStartsWithPrefix(center.getAccountNo(), null); + } + } + private void createAndValidateClientWithoutAccountPreference() { this.clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec); diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/CenterDomain.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/CenterDomain.java index 89b8df04f..5055756e0 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/CenterDomain.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/CenterDomain.java @@ -17,6 +17,7 @@ public class CenterDomain implements Comparable { public static class Builder { private Integer id; + private String accountNo; private HashMap status; private boolean active; private String name; @@ -31,6 +32,7 @@ public class CenterDomain implements Comparable { final String name, final String externalId, final Integer staffId, final int officeID, final String officeName, final String hierarchy, final ArrayList groupMembers) { this.id = id; + this.accountNo = accountNo; this.status = new HashMap(); this.status.put("id", statusid); this.status.put("code", statuscode); @@ -46,7 +48,7 @@ public class CenterDomain implements Comparable { } public CenterDomain build() { - return new CenterDomain(this.id, (int) this.status.get("id"), (String) this.status.get("code"), + return new CenterDomain(this.id, this.accountNo, (int) this.status.get("id"), (String) this.status.get("code"), (String) this.status.get("value"), this.active, this.name, this.externalId, this.staffId, this.officeId, this.officeName, this.hierarchy, groupMembers); } @@ -54,6 +56,7 @@ public class CenterDomain implements Comparable { } private Integer id; + private String accountNo; private HashMap status; private boolean active; private String name; @@ -68,10 +71,11 @@ public class CenterDomain implements Comparable { /* super(); */ } - private CenterDomain(final Integer id, final Integer statusid, final String statuscode, final String statusvalue, final boolean active, + private CenterDomain(final Integer id, final String accountNo, final Integer statusid, final String statuscode, final String statusvalue, final boolean active, final String name, final String externalId, final Integer staffId, final Integer officeID, final String officeName, final String hierarchy, final ArrayList groupMembers) { this.id = id; + this.accountNo = accountNo; this.status = new HashMap(); this.status.put("id", statusid); this.status.put("code", statuscode); @@ -180,6 +184,10 @@ public class CenterDomain implements Comparable { public String getHierarchy() { return this.hierarchy; } + + public String getAccountNo(){ + return this.accountNo; + } public int[] getGroupMembers() { int[] groupMemberList = new int[this.groupMembers.size()]; diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesHelper.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesHelper.java index 02f0ec059..428a73f86 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesHelper.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesHelper.java @@ -71,6 +71,36 @@ public class AccountNumberPreferencesHelper { requestJSON, jsonAttributeToGetBack); } + + public Object createGroupsAccountNumberPreference( + ResponseSpecification responseSpec, String jsonAttributeToGetBack) { + System.out + .println("---------------------------------CREATING GROUPS ACCOUNT NUMBER PREFERENCE------------------------------------------"); + + final String requestJSON = new AccountNumberPreferencesTestBuilder() + .groupsBuild(); + + final String URL = ACCOUNT_NUMBER_FORMATS_REQUEST_URL + "?" + + Utils.TENANT_IDENTIFIER; + return Utils.performServerPost(this.requestSpec, responseSpec, URL, + requestJSON, jsonAttributeToGetBack); + + } + + public Object createCenterAccountNumberPreference( + ResponseSpecification responseSpec, String jsonAttributeToGetBack) { + System.out + .println("---------------------------------CREATING CENTER ACCOUNT NUMBER PREFERENCE------------------------------------------"); + + final String requestJSON = new AccountNumberPreferencesTestBuilder() + .centerBuild(); + + final String URL = ACCOUNT_NUMBER_FORMATS_REQUEST_URL + "?" + + Utils.TENANT_IDENTIFIER; + return Utils.performServerPost(this.requestSpec, responseSpec, URL, + requestJSON, jsonAttributeToGetBack); + + } public HashMap createAccountNumberPreferenceWithInvalidData( ResponseSpecification responseSpec, String accountType, @@ -137,6 +167,8 @@ public class AccountNumberPreferencesHelper { final Integer clientAccountNumberPreferenceId, final Integer loanAccountNumberPreferenceId, final Integer savingsAccountNumberPreferenceId, + final Integer groupsAccountNumberPreferenceId, + final Integer centerAccountNumberPreferenceId, ResponseSpecification responseSpec, RequestSpecification requestSpec) { final String clientURL = ACCOUNT_NUMBER_FORMATS_REQUEST_URL + "/" @@ -155,6 +187,18 @@ public class AccountNumberPreferencesHelper { + Utils.TENANT_IDENTIFIER; Utils.performServerGet(requestSpec, responseSpec, savingsURL, "id"); + + final String groupsURL = ACCOUNT_NUMBER_FORMATS_REQUEST_URL + "/" + + groupsAccountNumberPreferenceId + "?" + + Utils.TENANT_IDENTIFIER; + + Utils.performServerGet(requestSpec, responseSpec, groupsURL, "id"); + + final String centerURL = ACCOUNT_NUMBER_FORMATS_REQUEST_URL + "/" + + centerAccountNumberPreferenceId + "?" + + Utils.TENANT_IDENTIFIER; + + Utils.performServerGet(requestSpec, responseSpec, centerURL, "id"); } public void verifyUpdationOfAccountNumberPreferences( diff --git a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesTestBuilder.java b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesTestBuilder.java index 7a6b088e1..1b0e61244 100644 --- a/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesTestBuilder.java +++ b/mifosng-provider/src/integrationTest/java/org/mifosplatform/integrationtests/common/system/AccountNumberPreferencesTestBuilder.java @@ -16,6 +16,10 @@ public class AccountNumberPreferencesTestBuilder { private String loanPrefixType = "1"; private String savingsAccountType = "3"; private String savingsPrefixType = "1"; + private String centerAccountType = "4"; + private String centerPrefixType = "1"; + private String groupsAccountType = "5"; + private String groupsPrefixType = "1"; public String clientBuild() { final HashMap map = new HashMap<>(); @@ -40,7 +44,23 @@ public class AccountNumberPreferencesTestBuilder { return new Gson().toJson(map); } + + public String groupsBuild() { + final HashMap map = new HashMap<>(); + map.put("accountType", groupsAccountType); + map.put("prefixType", groupsPrefixType); + return new Gson().toJson(map); + } + + public String centerBuild() { + final HashMap map = new HashMap<>(); + map.put("accountType", centerAccountType); + map.put("prefixType", centerPrefixType); + + return new Gson().toJson(map); + } + public String invalidDataBuild(String accountType, String prefixType) { final HashMap map = new HashMap<>(); map.put("accountType", accountType); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java index f6340dc98..58bd1dfae 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/data/AccountNumberFormatDataValidator.java @@ -86,23 +86,31 @@ public class AccountNumberFormatDataValidator { } - public Set determineValidAccountNumberPrefixes(EntityAccountType entityAccountType) { - Set validAccountNumberPrefixes = new HashSet<>(); + public Set determineValidAccountNumberPrefixes( + EntityAccountType entityAccountType) { + Set validAccountNumberPrefixes = new HashSet<>(); - switch (entityAccountType) { - case CLIENT: - validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForClientAccounts; - break; + switch (entityAccountType) { + case CLIENT: + validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForClientAccounts; + break; - case LOAN: - validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForLoanAccounts; - break; + case LOAN: + validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForLoanAccounts; + break; - case SAVINGS: - validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForSavingsAccounts; - break; + case SAVINGS: + validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForSavingsAccounts; + break; - } + case CENTER: + validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForCenters; + break; + + case GROUP: + validAccountNumberPrefixes = AccountNumberFormatEnumerations.accountNumberPrefixesForGroups; + break; + } Set validAccountNumberPrefixValues = new HashSet<>(); for (AccountNumberPrefixType validAccountNumberPrefix : validAccountNumberPrefixes) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java index 0e51a3752..73a31e2f8 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/AccountNumberFormatEnumerations.java @@ -23,6 +23,10 @@ public class AccountNumberFormatEnumerations { AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.LOAN_PRODUCT_SHORT_NAME)); public final static Set accountNumberPrefixesForSavingsAccounts = new HashSet<>(Arrays.asList( AccountNumberPrefixType.OFFICE_NAME, AccountNumberPrefixType.SAVINGS_PRODUCT_SHORT_NAME)); + public final static Set accountNumberPrefixesForCenters = new HashSet<>(Arrays.asList( + AccountNumberPrefixType.OFFICE_NAME)); + public final static Set accountNumberPrefixesForGroups = new HashSet<>(Arrays.asList( + AccountNumberPrefixType.OFFICE_NAME)); public enum AccountNumberPrefixType { OFFICE_NAME(1, "accountNumberPrefixType.officeName"), CLIENT_TYPE(101, "accountNumberPrefixType.clientType"), LOAN_PRODUCT_SHORT_NAME( diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/EntityAccountType.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/EntityAccountType.java index d1744da9e..f1fb166ab 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/EntityAccountType.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/domain/EntityAccountType.java @@ -9,7 +9,8 @@ import java.util.HashMap; import java.util.Map; public enum EntityAccountType { - CLIENT(1, "accountType.client"), LOAN(2, "accountType.loan"), SAVINGS(3, "accountType.savings"); + CLIENT(1, "accountType.client"), LOAN(2, "accountType.loan"), SAVINGS(3, "accountType.savings"), CENTER(4, "accountType.center"), + GROUP(5, "accountType.group"); private final Integer value; private final String code; @@ -76,5 +77,13 @@ public enum EntityAccountType { public boolean isSavingsAccount() { return this.value.equals(EntityAccountType.SAVINGS.getValue()); } + + public Boolean isCenterAccount(){ + return this.value.equals(EntityAccountType.CENTER.getValue()); + } + + public Boolean isGroupAccount(){ + return this.value.equals(EntityAccountType.GROUP.getValue()); + } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java index 737f8c719..b5abaeed3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/infrastructure/accountnumberformat/service/AccountNumberFormatReadPlatformServiceImpl.java @@ -127,6 +127,12 @@ public class AccountNumberFormatReadPlatformServiceImpl implements AccountNumber case SAVINGS: accountNumberPrefixTypesSet = AccountNumberFormatEnumerations.accountNumberPrefixesForSavingsAccounts; break; + case CENTER : + accountNumberPrefixTypesSet = AccountNumberFormatEnumerations.accountNumberPrefixesForCenters; + break; + case GROUP : + accountNumberPrefixTypesSet = AccountNumberFormatEnumerations.accountNumberPrefixesForGroups; + break; } Object[] array = accountNumberPrefixTypesSet.toArray(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/AccountNumberGenerator.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/AccountNumberGenerator.java index 2f6545ff3..3f77e21df 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/AccountNumberGenerator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/domain/AccountNumberGenerator.java @@ -12,6 +12,7 @@ import org.apache.commons.lang3.StringUtils; import org.mifosplatform.infrastructure.accountnumberformat.domain.AccountNumberFormat; import org.mifosplatform.infrastructure.accountnumberformat.domain.AccountNumberFormatEnumerations.AccountNumberPrefixType; import org.mifosplatform.infrastructure.codes.domain.CodeValue; +import org.mifosplatform.portfolio.group.domain.Group; import org.mifosplatform.portfolio.loanaccount.domain.Loan; import org.mifosplatform.portfolio.savings.domain.SavingsAccount; import org.springframework.stereotype.Component; @@ -89,5 +90,20 @@ public class AccountNumberGenerator { } return accountNumber; } + + public String generateGroupAccountNumber(Group group, AccountNumberFormat accountNumberFormat) { + Map propertyMap = new HashMap<>(); + propertyMap.put(ID, group.getId().toString()); + propertyMap.put(OFFICE_NAME, group.getOffice().getName()); + return generateAccountNumber(propertyMap, accountNumberFormat); + } + + public String generateCenterAccountNumber(Group group, AccountNumberFormat accountNumberFormat) { + Map propertyMap = new HashMap<>(); + propertyMap.put(ID, group.getId().toString()); + propertyMap.put(OFFICE_NAME, group.getOffice().getName()); + return generateAccountNumber(propertyMap, accountNumberFormat); + } + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java index 37c501b86..fbbd18f6a 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/client/service/ClientReadPlatformServiceImpl.java @@ -563,7 +563,7 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService private static final class ParentGroupsMapper implements RowMapper { public String parentGroupsSchema() { - return "gp.id As groupId , gp.display_name As groupName from m_client cl JOIN m_group_client gc ON cl.id = gc.client_id " + return "gp.id As groupId , gp.account_no as accountNo, gp.display_name As groupName from m_client cl JOIN m_group_client gc ON cl.id = gc.client_id " + "JOIN m_group gp ON gp.id = gc.group_id WHERE cl.id = ?"; } @@ -572,8 +572,9 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService final Long groupId = JdbcSupport.getLong(rs, "groupId"); final String groupName = rs.getString("groupName"); + final String accountNo = rs.getString("accountNo"); - return GroupGeneralData.lookup(groupId, groupName); + return GroupGeneralData.lookup(groupId, accountNo, groupName); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java index 3dd9f0c3e..92cadb37d 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/api/GroupingTypesApiConstants.java @@ -28,6 +28,7 @@ public class GroupingTypesApiConstants { public static final String groupIdParamName = "groupId"; public static final String clientIdParamName = "clientId"; public static final String groupRolesParamName = "groupRoles"; + public static final String accountNoParamName = "accountNo"; // general public static final String localeParamName = "locale"; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java index 81afb65bc..e1f9b6c27 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/CenterData.java @@ -20,6 +20,7 @@ import org.mifosplatform.portfolio.calendar.data.CalendarData; public class CenterData { private final Long id; + private String accountNo; private final String name; private final String externalId; private final Long officeId; @@ -44,23 +45,23 @@ public class CenterData { private final Collection officeOptions; private final Collection staffOptions; - public static CenterData template(final Long officeId, final LocalDate activationDate, final Collection officeOptions, + public static CenterData template(final Long officeId, final String accountNo, final LocalDate activationDate, final Collection officeOptions, final Collection staffOptions, final Collection groupMembersOptions) { final CalendarData collectionMeetingCalendar = null; final Collection closureReasons = null; final GroupTimelineData timeline = null; - return new CenterData(null, null, null, null, activationDate, officeId, null, null, null, null, null, officeOptions, staffOptions, + return new CenterData(null, accountNo, null, null, null, activationDate, officeId, null, null, null, null, null, officeOptions, staffOptions, groupMembersOptions, collectionMeetingCalendar, closureReasons, timeline); } public static CenterData withTemplate(final CenterData templateCenter, final CenterData center) { - return new CenterData(center.id, center.name, center.externalId, center.status, center.activationDate, center.officeId, + return new CenterData(center.id, center.accountNo, center.name, center.externalId, center.status, center.activationDate, center.officeId, center.officeName, center.staffId, center.staffName, center.hierarchy, center.groupMembers, templateCenter.officeOptions, templateCenter.staffOptions, templateCenter.groupMembersOptions, templateCenter.collectionMeetingCalendar, templateCenter.closureReasons, center.timeline); } - public static CenterData instance(final Long id, final String name, final String externalId, final EnumOptionData status, + public static CenterData instance(final Long id, final String accountNo, final String name, final String externalId, final EnumOptionData status, final LocalDate activationDate, final Long officeId, final String officeName, final Long staffId, final String staffName, final String hierarchy, final GroupTimelineData timeline, final CalendarData collectionMeetingCalendar) { @@ -70,13 +71,13 @@ public class CenterData { final Collection groupMembersOptions = null; final Collection closureReasons = null; - return new CenterData(id, name, externalId, status, activationDate, officeId, officeName, staffId, staffName, hierarchy, + return new CenterData(id, accountNo, name, externalId, status, activationDate, officeId, officeName, staffId, staffName, hierarchy, groupMembers, officeOptions, staffOptions, groupMembersOptions, collectionMeetingCalendar, closureReasons, timeline); } public static CenterData withAssociations(final CenterData centerData, final Collection groupMembers, final CalendarData collectionMeetingCalendar) { - return new CenterData(centerData.id, centerData.name, centerData.externalId, centerData.status, centerData.activationDate, + return new CenterData(centerData.id, centerData.accountNo, centerData.name, centerData.externalId, centerData.status, centerData.activationDate, centerData.officeId, centerData.officeName, centerData.staffId, centerData.staffName, centerData.hierarchy, groupMembers, centerData.officeOptions, centerData.staffOptions, centerData.groupMembersOptions, collectionMeetingCalendar, centerData.closureReasons, centerData.timeline); @@ -84,6 +85,7 @@ public class CenterData { public static CenterData withClosureReasons(final Collection closureReasons) { final Long id = null; + final String accountNo = null; final String name = null; final String externalId = null; final EnumOptionData status = null; @@ -99,16 +101,17 @@ public class CenterData { final Collection groupMembersOptions = null; final CalendarData collectionMeetingCalendar = null; final GroupTimelineData timeline = null; - return new CenterData(id, name, externalId, status, activationDate, officeId, officeName, staffId, staffName, hierarchy, + return new CenterData(id, accountNo, name, externalId, status, activationDate, officeId, officeName, staffId, staffName, hierarchy, groupMembers, officeOptions, staffOptions, groupMembersOptions, collectionMeetingCalendar, closureReasons, timeline); } - private CenterData(final Long id, final String name, final String externalId, final EnumOptionData status, + private CenterData(final Long id, final String accountNo, final String name, final String externalId, final EnumOptionData status, final LocalDate activationDate, final Long officeId, final String officeName, final Long staffId, final String staffName, final String hierarchy, final Collection groupMembers, final Collection officeOptions, final Collection staffOptions, final Collection groupMembersOptions, final CalendarData collectionMeetingCalendar, final Collection closureReasons, final GroupTimelineData timeline) { this.id = id; + this.accountNo = accountNo; this.name = name; this.externalId = externalId; this.status = status; @@ -146,6 +149,10 @@ public class CenterData { public Long getId() { return this.id; } + + public String getAccountNo(){ + return this.accountNo; + } public String getName() { return this.name; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupGeneralData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupGeneralData.java index bdb6444cd..7b62f36a5 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupGeneralData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/data/GroupGeneralData.java @@ -22,6 +22,7 @@ import org.mifosplatform.portfolio.client.data.ClientData; public class GroupGeneralData { private final Long id; + private final String accountNo; private final String name; private final String externalId; @@ -55,15 +56,15 @@ public class GroupGeneralData { private final Collection closureReasons; private final GroupTimelineData timeline; - public static GroupGeneralData lookup(final Long groupId, final String groupName) { + public static GroupGeneralData lookup(final Long groupId, final String accountNo, final String groupName) { final Collection clientMembers = null; final Collection groupRoles = null; final Collection closureReasons = null; - return new GroupGeneralData(groupId, groupName, null, null, null, null, null, null, null, null, null, null, clientMembers, null, null, + return new GroupGeneralData(groupId, accountNo, groupName, null, null, null, null, null, null, null, null, null, null, clientMembers, null, null, null, null, null, groupRoles, null, null, null, null, closureReasons, null); } - public static GroupGeneralData template(final Long officeId, final Long centerId, final String centerName, final Long staffId, + public static GroupGeneralData template(final Long officeId, final Long centerId, final String accountNo, final String centerName, final Long staffId, final String staffName, final Collection centerOptions, final Collection officeOptions, final Collection staffOptions, final Collection clientOptions, final Collection availableRoles) { @@ -72,13 +73,13 @@ public class GroupGeneralData { final Collection groupRoles = null; final Collection closureReasons = null; - return new GroupGeneralData(null, null, null, null, null, officeId, null, centerId, centerName, staffId, staffName, null, + return new GroupGeneralData(null, accountNo , null, null, null, null, officeId, null, centerId, centerName, staffId, staffName, null, clientMembers, null, centerOptions, officeOptions, staffOptions, clientOptions, groupRoles, availableRoles, null, null, null, closureReasons, null); } public static GroupGeneralData withTemplate(final GroupGeneralData templatedGrouping, final GroupGeneralData grouping) { - return new GroupGeneralData(grouping.id, grouping.name, grouping.externalId, grouping.status, grouping.activationDate, + return new GroupGeneralData(grouping.id, grouping.accountNo, grouping.name, grouping.externalId, grouping.status, grouping.activationDate, grouping.officeId, grouping.officeName, grouping.centerId, grouping.centerName, grouping.staffId, grouping.staffName, grouping.hierarchy, grouping.clientMembers, grouping.activeClientMembers, templatedGrouping.centerOptions, templatedGrouping.officeOptions, templatedGrouping.staffOptions, templatedGrouping.clientOptions, grouping.groupRoles, templatedGrouping.availableRoles, @@ -89,14 +90,14 @@ public class GroupGeneralData { public static GroupGeneralData withAssocations(final GroupGeneralData grouping, final Collection membersOfGroup, final Collection activeClientMembers, final Collection groupRoles, final Collection calendarsData, final CalendarData collectionMeetingCalendar) { - return new GroupGeneralData(grouping.id, grouping.name, grouping.externalId, grouping.status, grouping.activationDate, + return new GroupGeneralData(grouping.id, grouping.accountNo, grouping.name, grouping.externalId, grouping.status, grouping.activationDate, grouping.officeId, grouping.officeName, grouping.centerId, grouping.centerName, grouping.staffId, grouping.staffName, grouping.hierarchy, membersOfGroup, activeClientMembers, grouping.centerOptions, grouping.officeOptions, grouping.staffOptions, grouping.clientOptions, groupRoles, grouping.availableRoles, grouping.selectedRole, calendarsData, collectionMeetingCalendar, grouping.closureReasons, grouping.timeline); } - public static GroupGeneralData instance(final Long id, final String name, final String externalId, final EnumOptionData status, + public static GroupGeneralData instance(final Long id, final String accountNo, final String name, final String externalId, final EnumOptionData status, final LocalDate activationDate, final Long officeId, final String officeName, final Long centerId, final String centerName, final Long staffId, final String staffName, final String hierarchy, final GroupTimelineData timeline) { @@ -113,12 +114,12 @@ public class GroupGeneralData { final CalendarData collectionMeetingCalendar = null; final Collection closureReasons = null; - return new GroupGeneralData(id, name, externalId, status, activationDate, officeId, officeName, centerId, centerName, staffId, + return new GroupGeneralData(id, accountNo, name, externalId, status, activationDate, officeId, officeName, centerId, centerName, staffId, staffName, hierarchy, clientMembers, activeClientMembers, centerOptions, officeOptions, staffOptions, clientOptions, groupRoles, availableRoles, role, calendarsData, collectionMeetingCalendar, closureReasons, timeline); } - private GroupGeneralData(final Long id, final String name, final String externalId, final EnumOptionData status, + private GroupGeneralData(final Long id, final String accountNo, final String name, final String externalId, final EnumOptionData status, final LocalDate activationDate, final Long officeId, final String officeName, final Long centerId, final String centerName, final Long staffId, final String staffName, final String hierarchy, final Collection clientMembers, final Collection activeClientMembers, final Collection centerOptions, @@ -128,6 +129,7 @@ public class GroupGeneralData { final Collection calendarsData, final CalendarData collectionMeetingCalendar, final Collection closureReasons, final GroupTimelineData timeline) { this.id = id; + this.accountNo = accountNo; this.name = name; this.externalId = externalId; this.status = status; @@ -171,6 +173,10 @@ public class GroupGeneralData { public Long getId() { return this.id; } + + public String getAccountNo(){ + return this.accountNo; + } public String getName() { return this.name; @@ -193,7 +199,7 @@ public class GroupGeneralData { } public static GroupGeneralData updateSelectedRole(final GroupGeneralData grouping, final GroupRoleData selectedRole) { - return new GroupGeneralData(grouping.id, grouping.name, grouping.externalId, grouping.status, grouping.activationDate, + return new GroupGeneralData(grouping.id, grouping.accountNo, grouping.name, grouping.externalId, grouping.status, grouping.activationDate, grouping.officeId, grouping.officeName, grouping.centerId, grouping.centerName, grouping.staffId, grouping.staffName, grouping.hierarchy, grouping.clientMembers, grouping.activeClientMembers, grouping.centerOptions, grouping.officeOptions, grouping.staffOptions, grouping.clientOptions, grouping.groupRoles, grouping.availableRoles, @@ -202,6 +208,7 @@ public class GroupGeneralData { public static GroupGeneralData withClosureReasons(final Collection closureReasons) { final Long id = null; + final String accountNo = null; final String name = null; final String externalId = null; final EnumOptionData status = null; @@ -225,7 +232,7 @@ public class GroupGeneralData { final Collection calendarsData = null; final CalendarData collectionMeetingCalendar = null; - return new GroupGeneralData(id, name, externalId, status, activationDate, officeId, officeName, centerId, centerName, staffId, + return new GroupGeneralData(id, accountNo, name, externalId, status, activationDate, officeId, officeName, centerId, centerName, staffId, staffName, hierarchy, clientMembers, activeClientMembers, centerOptions, officeOptions, staffOptions, clientOptions, groupRoles, availableRoles, role, calendarsData, collectionMeetingCalendar, closureReasons, null); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/domain/Group.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/domain/Group.java index dd1a170e0..13df8a9dd 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/domain/Group.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/domain/Group.java @@ -26,6 +26,7 @@ import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import javax.persistence.Transient; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; @@ -36,6 +37,7 @@ import org.mifosplatform.infrastructure.core.data.ApiParameterError; import org.mifosplatform.infrastructure.core.exception.GeneralPlatformDomainRuleException; import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException; import org.mifosplatform.infrastructure.core.service.DateUtils; +import org.mifosplatform.infrastructure.security.service.RandomPasswordGenerator; import org.mifosplatform.organisation.office.domain.Office; import org.mifosplatform.organisation.staff.domain.Staff; import org.mifosplatform.portfolio.client.domain.Client; @@ -121,6 +123,12 @@ public final class Group extends AbstractPersistable { @OneToMany(cascade = CascadeType.ALL, mappedBy = "center", orphanRemoval = true) private Set staffHistory; + + @Column(name = "account_no", length = 20, unique = true, nullable = false) + private String accountNumber; + + @Transient + private boolean accountNumberRequiresAutoGeneration = false; // JPA default constructor for entity protected Group() { @@ -131,7 +139,8 @@ public final class Group extends AbstractPersistable { public static Group newGroup(final Office office, final Staff staff, final Group parent, final GroupLevel groupLevel, final String name, final String externalId, final boolean active, final LocalDate activationDate, - final Set clientMembers, final Set groupMembers, final LocalDate submittedOnDate, final AppUser currentUser) { + final Set clientMembers, final Set groupMembers, final LocalDate submittedOnDate, final AppUser currentUser, + final String accountNo) { // By default new group is created in PENDING status, unless explicitly // status is set to active @@ -141,14 +150,14 @@ public final class Group extends AbstractPersistable { status = GroupingTypeStatus.ACTIVE; groupActivationDate = activationDate; } - + return new Group(office, staff, parent, groupLevel, name, externalId, status, groupActivationDate, clientMembers, groupMembers, - submittedOnDate, currentUser); + submittedOnDate, currentUser, accountNo); } private Group(final Office office, final Staff staff, final Group parent, final GroupLevel groupLevel, final String name, final String externalId, final GroupingTypeStatus status, final LocalDate activationDate, final Set clientMembers, - final Set groupMembers, final LocalDate submittedOnDate, final AppUser currentUser) { + final Set groupMembers, final LocalDate submittedOnDate, final AppUser currentUser, final String accountNo) { final List dataValidationErrors = new ArrayList<>(); @@ -160,6 +169,13 @@ public final class Group extends AbstractPersistable { if (parent != null) { this.parent.addChild(this); } + + if (StringUtils.isBlank(accountNo)) { + this.accountNumber = new RandomPasswordGenerator(19).generate(); + this.accountNumberRequiresAutoGeneration = true; + } else { + this.accountNumber = accountNo; + } if (StringUtils.isNotBlank(name)) { this.name = name.trim(); @@ -303,6 +319,12 @@ public final class Group extends AbstractPersistable { final LocalDate newValue = command.localDateValueOfParameterNamed(GroupingTypesApiConstants.activationDateParamName); this.activationDate = newValue.toDate(); } + + if (command.isChangeInStringParameterNamed(GroupingTypesApiConstants.accountNoParamName, this.accountNumber)) { + final String newValue = command.stringValueOfParameterNamed(GroupingTypesApiConstants.accountNoParamName); + actualChanges.put(GroupingTypesApiConstants.accountNoParamName, newValue); + this.accountNumber = StringUtils.defaultIfEmpty(newValue, null); + } return actualChanges; } @@ -692,4 +714,17 @@ public final class Group extends AbstractPersistable { } return latestRecordWithNoEndDate; } + + public boolean isAccountNumberRequiresAutoGeneration() { + return this.accountNumberRequiresAutoGeneration; + } + + public void setAccountNumberRequiresAutoGeneration(final boolean accountNumberRequiresAutoGeneration) { + this.accountNumberRequiresAutoGeneration = accountNumberRequiresAutoGeneration; + } + + public void updateAccountNo(final String accountIdentifier) { + this.accountNumber = accountIdentifier; + this.accountNumberRequiresAutoGeneration = false; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/AllGroupTypesDataMapper.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/AllGroupTypesDataMapper.java index fcf7f0c6d..a053f0e42 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/AllGroupTypesDataMapper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/AllGroupTypesDataMapper.java @@ -25,7 +25,7 @@ public final class AllGroupTypesDataMapper implements RowMapper groupMembersOptions = null; + final String accountNo = null; // final boolean clientPendingApprovalAllowed = // this.configurationDomainService.isClientPendingApprovalAllowedEnabled(); - return CenterData.template(officeIdDefaulted, new LocalDate(), officeOptions, staffOptions, groupMembersOptions); + return CenterData.template(officeIdDefaulted, accountNo, new LocalDate(), officeOptions, staffOptions, groupMembersOptions); } private Long defaultToUsersOfficeIfNull(final Long officeId) { @@ -469,7 +473,7 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService clientOptions = null; } - return GroupGeneralData.template(centerOfficeId, center.getId(), center.getName(), staffId, staffName, centerOptions, + return GroupGeneralData.template(centerOfficeId, center.getId(), center.getAccountNo(), center.getName(), staffId, staffName, centerOptions, officeOptions, staffOptions, clientOptions, null); } @@ -513,6 +517,8 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService flag = false; if (staffCenterData.getStaffId().equals(centerData.staffId())) { staffCenterData.getMeetingFallCenters().add(centerData); + + flag = true; break; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java index b5fb7f60e..1a6171fc1 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupReadPlatformServiceImpl.java @@ -104,12 +104,13 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { .retrieveCodeValuesByCode(GroupingTypesApiConstants.GROUP_ROLE_NAME); final Long centerId = null; + final String accountNo = null; final String centerName = null; final Long staffId = null; final String staffName = null; final Collection clientOptions = null; - return GroupGeneralData.template(defaultOfficeId, centerId, centerName, staffId, staffName, centerOptions, officeOptions, + return GroupGeneralData.template(defaultOfficeId, centerId, accountNo, centerName, staffId, staffName, centerOptions, officeOptions, staffOptions, clientOptions, availableRoles); } @@ -264,14 +265,15 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { private static final class GroupLookupDataMapper implements RowMapper { public final String schema() { - return "g.id as id, g.display_name as displayName from m_group g where g.level_id = 2 "; + return "g.id as id, g.account_no as accountNo, g.display_name as displayName from m_group g where g.level_id = 2 "; } @Override public GroupGeneralData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { final Long id = JdbcSupport.getLong(rs, "id"); + final String accountNo = rs.getString("accountNo"); final String displayName = rs.getString("displayName"); - return GroupGeneralData.lookup(id, displayName); + return GroupGeneralData.lookup(id, accountNo, displayName); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index 2afdd890f..671efa08c 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -17,6 +17,9 @@ import org.joda.time.LocalDate; import org.mifosplatform.commands.domain.CommandWrapper; import org.mifosplatform.commands.service.CommandProcessingService; import org.mifosplatform.commands.service.CommandWrapperBuilder; +import org.mifosplatform.infrastructure.accountnumberformat.domain.AccountNumberFormat; +import org.mifosplatform.infrastructure.accountnumberformat.domain.AccountNumberFormatRepositoryWrapper; +import org.mifosplatform.infrastructure.accountnumberformat.domain.EntityAccountType; import org.mifosplatform.infrastructure.codes.domain.CodeValue; import org.mifosplatform.infrastructure.codes.domain.CodeValueRepositoryWrapper; import org.mifosplatform.infrastructure.configuration.domain.ConfigurationDomainService; @@ -37,6 +40,7 @@ import org.mifosplatform.portfolio.calendar.domain.CalendarEntityType; import org.mifosplatform.portfolio.calendar.domain.CalendarInstance; import org.mifosplatform.portfolio.calendar.domain.CalendarInstanceRepository; import org.mifosplatform.portfolio.calendar.domain.CalendarType; +import org.mifosplatform.portfolio.client.domain.AccountNumberGenerator; import org.mifosplatform.portfolio.client.domain.Client; import org.mifosplatform.portfolio.client.domain.ClientRepositoryWrapper; import org.mifosplatform.portfolio.client.service.LoanStatusMapper; @@ -91,6 +95,8 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group private final ConfigurationDomainService configurationDomainService; private final SavingsAccountRepository savingsAccountRepository; private final LoanRepositoryWrapper loanRepositoryWrapper; + private final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository; + private final AccountNumberGenerator accountNumberGenerator; @Autowired public GroupingTypesWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, @@ -100,7 +106,8 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group final LoanRepository loanRepository, final SavingsAccountRepository savingsRepository, final CodeValueRepositoryWrapper codeValueRepository, final CommandProcessingService commandProcessingService, final CalendarInstanceRepository calendarInstanceRepository, final ConfigurationDomainService configurationDomainService, - final SavingsAccountRepository savingsAccountRepository, final LoanRepositoryWrapper loanRepositoryWrapper) { + final SavingsAccountRepository savingsAccountRepository, final LoanRepositoryWrapper loanRepositoryWrapper, + final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final AccountNumberGenerator accountNumberGenerator) { this.context = context; this.groupRepository = groupRepository; this.clientRepositoryWrapper = clientRepositoryWrapper; @@ -117,10 +124,13 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group this.configurationDomainService = configurationDomainService; this.savingsAccountRepository = savingsAccountRepository; this.loanRepositoryWrapper = loanRepositoryWrapper; + this.accountNumberFormatRepository = accountNumberFormatRepository; + this.accountNumberGenerator = accountNumberGenerator; } private CommandProcessingResult createGroupingType(final JsonCommand command, final GroupTypes groupingType, final Long centerId) { try { + final String accountNo = command.stringValueOfParameterNamed(GroupingTypesApiConstants.accountNoParamName); final String name = command.stringValueOfParameterNamed(GroupingTypesApiConstants.nameParamName); final String externalId = command.stringValueOfParameterNamed(GroupingTypesApiConstants.externalIdParamName); @@ -163,7 +173,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group } final Group newGroup = Group.newGroup(groupOffice, staff, parentGroup, groupLevel, name, externalId, active, activationDate, - clientMembers, groupMembers, submittedOnDate, currentUser); + clientMembers, groupMembers, submittedOnDate, currentUser, accountNo); boolean rollbackTransaction = false; if (newGroup.isActive()) { @@ -194,6 +204,23 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group * groups if they exist */ newGroup.generateHierarchy(); + + if (newGroup.isAccountNumberRequiresAutoGeneration()) { + EntityAccountType entityAccountType = null; + AccountNumberFormat accountNumberFormat = null; + if(newGroup.isCenter()){ + entityAccountType = EntityAccountType.CENTER; + accountNumberFormat = this.accountNumberFormatRepository + .findByAccountType(entityAccountType); + newGroup.updateAccountNo(this.accountNumberGenerator.generateCenterAccountNumber(newGroup, accountNumberFormat)); + }else { + entityAccountType = EntityAccountType.GROUP; + accountNumberFormat = this.accountNumberFormatRepository + .findByAccountType(entityAccountType); + newGroup.updateAccountNo(this.accountNumberGenerator.generateGroupAccountNumber(newGroup, accountNumberFormat)); + } + + } this.groupRepository.saveAndFlush(newGroup); newGroup.captureStaffHistoryDuringCenterCreation(staff, activationDate); 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 a65c4a34a..77d7dc64a 100755 --- 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 @@ -544,7 +544,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { + " lp.allow_multiple_disbursals as multiDisburseLoan," + " lp.can_define_fixed_emi_amount as canDefineInstallmentAmount," + " c.id as clientId, c.display_name as clientName, c.office_id as clientOfficeId," - + " g.id as groupId, g.display_name as groupName," + + " g.id as groupId, g.account_no as groupAccountNo, g.display_name as groupName," + " g.office_id as groupOfficeId, g.staff_id As groupStaffId , g.parent_id as groupParentId, " + " g.hierarchy As groupHierarchy , g.external_id As groupExternalId, " + " g.status_enum as statusEnum, g.activation_date as activationDate, " @@ -652,6 +652,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final Long groupId = JdbcSupport.getLong(rs, "groupId"); final String groupName = rs.getString("groupName"); + final String groupAccountNo = rs.getString("groupAccountNo"); final String groupExternalId = rs.getString("groupExternalId"); final Long groupOfficeId = JdbcSupport.getLong(rs, "groupOfficeId"); final Long groupStaffId = JdbcSupport.getLong(rs, "groupStaffId"); @@ -836,7 +837,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { final Integer groupStatusEnum = JdbcSupport.getInteger(rs, "statusEnum"); final EnumOptionData groupStatus = ClientEnumerations.status(groupStatusEnum); final LocalDate activationDate = JdbcSupport.getLocalDate(rs, "activationDate"); - groupData = GroupGeneralData.instance(groupId, groupName, groupExternalId, groupStatus, activationDate, groupOfficeId, + groupData = GroupGeneralData.instance(groupId, groupAccountNo, groupName, groupExternalId, groupStatus, activationDate, groupOfficeId, null, groupParentId, null, groupStaffId, null, groupHierarchy, null); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/search/service/SearchReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/search/service/SearchReadPlatformServiceImpl.java index 610fb8356..6a150a052 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/search/service/SearchReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/search/service/SearchReadPlatformServiceImpl.java @@ -114,13 +114,13 @@ public class SearchReadPlatformServiceImpl implements SearchReadPlatformService + " from m_client_identifier ci join m_client c on ci.client_id=c.id join m_office o on o.id = c.office_id " + " where o.hierarchy like :hierarchy and (ci.document_key like :partialSearch and ci.document_key not like :search))"; - final String groupExactMatchSql = " (select IF(g.level_id=1,'CENTER','GROUP') as entityType, g.id as entityId, g.display_name as entityName, g.external_id as entityExternalId, NULL as entityAccountNo " + final String groupExactMatchSql = " (select IF(g.level_id=1,'CENTER','GROUP') as entityType, g.id as entityId, g.display_name as entityName, g.external_id as entityExternalId, g.account_no as entityAccountNo " + " , g.office_id as parentId, o.name as parentName, null as entityMobileNo, g.status_enum as entityStatusEnum " - + " from m_group g join m_office o on o.id = g.office_id where o.hierarchy like :hierarchy and (g.display_name like :search or g.external_id like :search or g.id like :search )) "; + + " from m_group g join m_office o on o.id = g.office_id where o.hierarchy like :hierarchy and (g.account_no like :search or g.display_name like :search or g.external_id like :search or g.id like :search )) "; - final String groupMatchSql = " (select IF(g.level_id=1,'CENTER','GROUP') as entityType, g.id as entityId, g.display_name as entityName, g.external_id as entityExternalId, NULL as entityAccountNo " + final String groupMatchSql = " (select IF(g.level_id=1,'CENTER','GROUP') as entityType, g.id as entityId, g.display_name as entityName, g.external_id as entityExternalId, g.account_no as entityAccountNo " + " , g.office_id as parentId, o.name as parentName, null as entityMobileNo, g.status_enum as entityStatusEnum " - + " from m_group g join m_office o on o.id = g.office_id where o.hierarchy like :hierarchy and (g.display_name like :partialSearch and g.display_name not like :search) or(g.external_id like :partialSearch and g.external_id not like :search) or (g.id like :partialSearch and g.id not like :search)) "; + + " from m_group g join m_office o on o.id = g.office_id where o.hierarchy like :hierarchy and (g.account_no like :partialSearch and g.account_no not like :search) or (g.display_name like :partialSearch and g.display_name not like :search) or(g.external_id like :partialSearch and g.external_id not like :search) or (g.id like :partialSearch and g.id not like :search)) "; final StringBuffer sql = new StringBuffer(); diff --git a/mifosng-provider/src/main/resources/sql/migrations/core_db/V261__accountNumber_for_groups.sql b/mifosng-provider/src/main/resources/sql/migrations/core_db/V261__accountNumber_for_groups.sql new file mode 100644 index 000000000..027b7e9b3 --- /dev/null +++ b/mifosng-provider/src/main/resources/sql/migrations/core_db/V261__accountNumber_for_groups.sql @@ -0,0 +1,2 @@ +ALTER TABLE m_group ADD COLUMN `account_no` VARCHAR(20) NOT NULL; +UPDATE m_group set account_no = lpad(id,9,0); \ No newline at end of file