/** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mifosplatform.portfolio.client.domain; import java.util.HashMap; import java.util.Map; 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; /** * Example {@link AccountNumberGenerator} for clients that takes an entities * auto generated database id and zero fills it ensuring the identifier is * always of a given <code>maxLength</code>. */ @Component public class AccountNumberGenerator { private final static int maxLength = 9; private final static String ID = "id"; private final static String CLIENT_TYPE = "clientType"; private final static String OFFICE_NAME = "officeName"; private final static String LOAN_PRODUCT_SHORT_NAME = "loanProductShortName"; private final static String SAVINGS_PRODUCT_SHORT_NAME = "savingsProductShortName"; public String generate(Client client, AccountNumberFormat accountNumberFormat) { Map<String, String> propertyMap = new HashMap<>(); propertyMap.put(ID, client.getId().toString()); propertyMap.put(OFFICE_NAME, client.getOffice().getName()); CodeValue clientType = client.clientType(); if (clientType != null) { propertyMap.put(CLIENT_TYPE, clientType.label()); } return generateAccountNumber(propertyMap, accountNumberFormat); } public String generate(Loan loan, AccountNumberFormat accountNumberFormat) { Map<String, String> propertyMap = new HashMap<>(); propertyMap.put(ID, loan.getId().toString()); propertyMap.put(OFFICE_NAME, loan.getOffice().getName()); propertyMap.put(LOAN_PRODUCT_SHORT_NAME, loan.loanProduct().getShortName()); return generateAccountNumber(propertyMap, accountNumberFormat); } public String generate(SavingsAccount savingsAccount, AccountNumberFormat accountNumberFormat) { Map<String, String> propertyMap = new HashMap<>(); propertyMap.put(ID, savingsAccount.getId().toString()); propertyMap.put(OFFICE_NAME, savingsAccount.office().getName()); propertyMap.put(SAVINGS_PRODUCT_SHORT_NAME, savingsAccount.savingsProduct().getShortName()); return generateAccountNumber(propertyMap, accountNumberFormat); } private String generateAccountNumber(Map<String, String> propertyMap, AccountNumberFormat accountNumberFormat) { String accountNumber = StringUtils.leftPad(propertyMap.get(ID), AccountNumberGenerator.maxLength, '0'); if (accountNumberFormat != null && accountNumberFormat.getPrefixEnum() != null) { AccountNumberPrefixType accountNumberPrefixType = AccountNumberPrefixType.fromInt(accountNumberFormat.getPrefixEnum()); String prefix = null; switch (accountNumberPrefixType) { case CLIENT_TYPE: prefix = propertyMap.get(CLIENT_TYPE); break; case OFFICE_NAME: prefix = propertyMap.get(OFFICE_NAME); break; case LOAN_PRODUCT_SHORT_NAME: prefix = propertyMap.get(LOAN_PRODUCT_SHORT_NAME); break; case SAVINGS_PRODUCT_SHORT_NAME: prefix = propertyMap.get(SAVINGS_PRODUCT_SHORT_NAME); break; default: break; } accountNumber = StringUtils.overlay(accountNumber, prefix, 0, 0); } return accountNumber; } public String generateGroupAccountNumber(Group group, AccountNumberFormat accountNumberFormat) { Map<String, String> 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<String, String> propertyMap = new HashMap<>(); propertyMap.put(ID, group.getId().toString()); propertyMap.put(OFFICE_NAME, group.getOffice().getName()); return generateAccountNumber(propertyMap, accountNumberFormat); } }