Update GLAccount and regenerate hierarchy of GLAccount
This commit is contained in:
+10
-1
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+11
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+1
-1
@@ -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,
|
||||||
|
|||||||
+50
-32
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user