Update GLAccount and regenerate hierarchy of GLAccount

This commit is contained in:
goutham-M
2013-05-10 10:08:42 +05:30
parent 4712a1e3a9
commit 8a86289c9d
5 changed files with 73 additions and 35 deletions
@@ -62,7 +62,6 @@ public class GLAccount extends AbstractPersistable<Long> {
@Column(name = "description", nullable = true, length = 500) @Column(name = "description", nullable = true, length = 500)
private String description; private String description;
@SuppressWarnings("unused")
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "tag_id") @JoinColumn(name = "tag_id")
private CodeValue tagId; private CodeValue tagId;
@@ -106,6 +105,7 @@ public class GLAccount extends AbstractPersistable<Long> {
handlePropertyUpdate(command, actualChanges, GLAccountJsonInputParams.PARENT_ID.getValue(), 0L); handlePropertyUpdate(command, actualChanges, GLAccountJsonInputParams.PARENT_ID.getValue(), 0L);
handlePropertyUpdate(command, actualChanges, GLAccountJsonInputParams.TYPE.getValue(), this.type, true); handlePropertyUpdate(command, actualChanges, GLAccountJsonInputParams.TYPE.getValue(), this.type, true);
handlePropertyUpdate(command, actualChanges, GLAccountJsonInputParams.USAGE.getValue(), this.usage, true); handlePropertyUpdate(command, actualChanges, GLAccountJsonInputParams.USAGE.getValue(), this.usage, true);
handlePropertyUpdate(command, actualChanges, GLAccountJsonInputParams.TAGID.getValue(), this.tagId==null?0L:this.tagId.getId());
return actualChanges; return actualChanges;
} }
@@ -224,4 +224,13 @@ public class GLAccount extends AbstractPersistable<Long> {
public boolean isDetailAccount() { public boolean isDetailAccount() {
return GLAccountUsage.DETAIL.getValue().equals(this.usage); return GLAccountUsage.DETAIL.getValue().equals(this.usage);
} }
public void updateTagId(CodeValue tagID) {
this.tagId = tagID;
}
public void updateParentAccount(GLAccount parentAccount) {
this.parent=parentAccount;
this.generateHierarchy();
}
} }
@@ -13,6 +13,6 @@ import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceN
public class GLAccountNotFoundException extends AbstractPlatformResourceNotFoundException { public class GLAccountNotFoundException extends AbstractPlatformResourceNotFoundException {
public GLAccountNotFoundException(final Long id) { public GLAccountNotFoundException(final Long id) {
super("error.msg.glaccount.id.invalid", "General Ledger account with identifier " + id + " does not exist", id); super("error.msg.glaccount.id.invalid", "General Ledger account with identifier " + id + " does not exist ", id);
} }
} }
@@ -0,0 +1,11 @@
package org.mifosplatform.accounting.glaccount.exception;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformDomainRuleException;
public class InvalidParentGLAccountHeadException extends AbstractPlatformDomainRuleException {
public InvalidParentGLAccountHeadException(Long glAccountId, Long parentId) {
super("error.msg.glaccount.id.and.parentid.must.not.same", "parentId:"+parentId+", id"+glAccountId+" should not be same", glAccountId, parentId);
}
}
@@ -63,7 +63,7 @@ public class GLAccountReadPlatformServiceImpl implements GLAccountReadPlatformSe
final EnumOptionData usage = AccountingEnumerations.gLAccountUsage(usageId); final EnumOptionData usage = AccountingEnumerations.gLAccountUsage(usageId);
final String description = rs.getString("description"); final String description = rs.getString("description");
final String nameDecorated = rs.getString("nameDecorated"); final String nameDecorated = rs.getString("nameDecorated");
final Long codeId = rs.getLong("codeId"); final Long codeId = rs.wasNull()? null : rs.getLong("codeId");
final String codeValue = rs.getString("codeValue"); final String codeValue = rs.getString("codeValue");
CodeValueData tagId = CodeValueData.instance(codeId, codeValue); CodeValueData tagId = CodeValueData.instance(codeId, codeValue);
return new GLAccountData(id, name, parentId, glCode, disabled, manualEntriesAllowed, accountType, usage, description, return new GLAccountData(id, name, parentId, glCode, disabled, manualEntriesAllowed, accountType, usage, description,
@@ -21,6 +21,7 @@ import org.mifosplatform.accounting.glaccount.exception.GLAccountInvalidParentEx
import org.mifosplatform.accounting.glaccount.exception.GLAccountInvalidUpdateException; import org.mifosplatform.accounting.glaccount.exception.GLAccountInvalidUpdateException;
import org.mifosplatform.accounting.glaccount.exception.GLAccountInvalidUpdateException.GL_ACCOUNT_INVALID_UPDATE_REASON; import org.mifosplatform.accounting.glaccount.exception.GLAccountInvalidUpdateException.GL_ACCOUNT_INVALID_UPDATE_REASON;
import org.mifosplatform.accounting.glaccount.exception.GLAccountNotFoundException; import org.mifosplatform.accounting.glaccount.exception.GLAccountNotFoundException;
import org.mifosplatform.accounting.glaccount.exception.InvalidParentGLAccountHeadException;
import org.mifosplatform.accounting.glaccount.serialization.GLAccountCommandFromApiJsonDeserializer; import org.mifosplatform.accounting.glaccount.serialization.GLAccountCommandFromApiJsonDeserializer;
import org.mifosplatform.accounting.journalentry.domain.JournalEntry; import org.mifosplatform.accounting.journalentry.domain.JournalEntry;
import org.mifosplatform.accounting.journalentry.domain.JournalEntryRepository; import org.mifosplatform.accounting.journalentry.domain.JournalEntryRepository;
@@ -75,31 +76,11 @@ public class GLAccountWritePlatformServiceJpaRepositoryImpl implements GLAccount
final Long tagId = command.longValueOfParameterNamed(GLAccountJsonInputParams.TAGID.getValue()); final Long tagId = command.longValueOfParameterNamed(GLAccountJsonInputParams.TAGID.getValue());
final Long type = command.longValueOfParameterNamed(GLAccountJsonInputParams.TYPE.getValue()); final Long type = command.longValueOfParameterNamed(GLAccountJsonInputParams.TYPE.getValue());
GLAccountType accountType = GLAccountType.fromInt(type.intValue()); GLAccountType accountType = GLAccountType.fromInt(type.intValue());
if (accountType == null) {
// TODO: Vishwas - should throw appropriate class that extends if(tagId != null) {
// AbstractPlatformResourceNotFoundException glAccountTagType = retrieveTagId(tagId, accountType);
throw new RuntimeException("Invalid GLAccount Type"); }
}
if (tagId != null) {
if (accountType.isAssetType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.ASSESTS_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isLiabilityType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.LIABILITIES_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isEquityType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.EQUITY_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isIncomeType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.INCOME_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isExpenseType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.EXPENSES_TAG_OPTION_CODE_NAME, tagId);
}
}
final GLAccount glAccount = GLAccount.fromJson(parentGLAccount, command, glAccountTagType); final GLAccount glAccount = GLAccount.fromJson(parentGLAccount, command, glAccountTagType);
this.glAccountRepository.saveAndFlush(glAccount); this.glAccountRepository.saveAndFlush(glAccount);
@@ -122,6 +103,10 @@ public class GLAccountWritePlatformServiceJpaRepositoryImpl implements GLAccount
final GLAccountCommand accountCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json()); final GLAccountCommand accountCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json());
accountCommand.validateForUpdate(); accountCommand.validateForUpdate();
final Long parentId = command.longValueOfParameterNamed(GLAccountJsonInputParams.PARENT_ID.getValue());
if (glAccountId.equals(parentId)) {
throw new InvalidParentGLAccountHeadException(glAccountId,parentId);
}
// is the glAccount valid // is the glAccount valid
final GLAccount glAccount = this.glAccountRepository.findOne(glAccountId); final GLAccount glAccount = this.glAccountRepository.findOne(glAccountId);
if (glAccount == null) { throw new GLAccountNotFoundException(glAccountId); } if (glAccount == null) { throw new GLAccountNotFoundException(glAccountId); }
@@ -130,8 +115,18 @@ public class GLAccountWritePlatformServiceJpaRepositoryImpl implements GLAccount
// is the new parent valid // is the new parent valid
if (changesOnly.containsKey(GLAccountJsonInputParams.PARENT_ID.getValue())) { if (changesOnly.containsKey(GLAccountJsonInputParams.PARENT_ID.getValue())) {
final Long parentId = command.longValueOfParameterNamed(GLAccountJsonInputParams.PARENT_ID.getValue()); GLAccount parentAccount = validateParentGLAccount(parentId);
validateParentGLAccount(parentId); glAccount.updateParentAccount(parentAccount);
}
if (changesOnly.containsKey(GLAccountJsonInputParams.TAGID.getValue())) {
final Long tagIdLongValue = command.longValueOfParameterNamed(GLAccountJsonInputParams.TAGID.getValue());
final GLAccountType accountType = GLAccountType.fromInt(glAccount.getType());
CodeValue tagID = null;
if (tagIdLongValue != null) {
tagID = retrieveTagId(tagIdLongValue, accountType);
}
glAccount.updateTagId(tagID);
} }
/** /**
@@ -184,11 +179,13 @@ public class GLAccountWritePlatformServiceJpaRepositoryImpl implements GLAccount
* @return * @return
*/ */
private GLAccount validateParentGLAccount(final Long parentAccountId) { private GLAccount validateParentGLAccount(final Long parentAccountId) {
GLAccount parentGLAccount; GLAccount parentGLAccount = null;
parentGLAccount = this.glAccountRepository.findOne(parentAccountId); if (parentAccountId != null){
if (parentGLAccount == null) { throw new GLAccountNotFoundException(parentAccountId); } parentGLAccount = this.glAccountRepository.findOne(parentAccountId);
// ensure parent is not a detail account if (parentGLAccount == null) { throw new GLAccountNotFoundException(parentAccountId); }
if (parentGLAccount.isDetailAccount()) { throw new GLAccountInvalidParentException(parentAccountId); } // ensure parent is not a detail account
if (parentGLAccount.isDetailAccount()) { throw new GLAccountInvalidParentException(parentAccountId); }
}
return parentGLAccount; return parentGLAccount;
} }
@@ -207,5 +204,26 @@ public class GLAccountWritePlatformServiceJpaRepositoryImpl implements GLAccount
throw new PlatformDataIntegrityException("error.msg.glAccount.unknown.data.integrity.issue", throw new PlatformDataIntegrityException("error.msg.glAccount.unknown.data.integrity.issue",
"Unknown data integrity issue with resource GL Account: " + realCause.getMessage()); "Unknown data integrity issue with resource GL Account: " + realCause.getMessage());
} }
private CodeValue retrieveTagId(Long tagId, GLAccountType accountType) {
CodeValue glAccountTagType = null;
if (accountType.isAssetType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.ASSESTS_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isLiabilityType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.LIABILITIES_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isEquityType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.EQUITY_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isIncomeType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.INCOME_TAG_OPTION_CODE_NAME, tagId);
} else if (accountType.isExpenseType()) {
glAccountTagType = this.codeValueRepositoryWrapper.findOneByCodeNameAndIdWithNotFoundDetection(
AccountingConstants.EXPENSES_TAG_OPTION_CODE_NAME, tagId);
}
return glAccountTagType;
}
} }