/* * eGov suite of products aim to improve the internal efficiency,transparency, * accountability and the service delivery of the government organizations. * * Copyright (C) <2015> eGovernments Foundation * * The updated version of eGov suite of products as by eGovernments Foundation * is available at http://www.egovernments.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ or * http://www.gnu.org/licenses/gpl.html . * * In addition to the terms of the GPL license to be adhered to in using this * program, the following additional terms are to be complied with: * * 1) All versions of this program, verbatim or modified must carry this * Legal Notice. * * 2) Any misrepresentation of the origin of the material is prohibited. It * is required that all modified versions of this material be marked in * reasonable ways as different from the original version. * * 3) This license does not grant any rights to any user of the program * with regards to rights under trademark law for use of the trade names * or trademarks of eGovernments Foundation. * * In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org. */ package org.egov.egf.web.actions.masters; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import org.apache.struts2.interceptor.validation.SkipValidation; import org.egov.commons.Accountdetailtype; import org.egov.commons.CChartOfAccountDetail; import org.egov.commons.CChartOfAccounts; import org.egov.commons.EgfAccountcodePurpose; import org.egov.commons.dao.ChartOfAccountsHibernateDAO; import org.egov.infra.admin.master.service.AppConfigValueService; import org.egov.infra.validation.exception.ValidationError; import org.egov.infra.validation.exception.ValidationException; import org.egov.infra.web.struts.actions.BaseFormAction; import org.egov.infstr.services.PersistenceService; import org.egov.model.masters.AccountCodePurpose; import org.egov.utils.Constants; import org.hibernate.SQLQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import com.exilant.GLEngine.ChartOfAccounts; import com.exilant.GLEngine.CoaCache; @ParentPackage("egov") @Results({ @Result(name = "detailed", location = "chartOfAccounts-detailed.jsp"), @Result(name = Constants.EDIT, location = "chartOfAccounts-edit.jsp"), @Result(name = Constants.VIEW, location = "chartOfAccounts-view.jsp"), @Result(name = Constants.VIEW_COA, location = "chartOfAccounts-viewCoa.jsp"), @Result(name = Constants.VIEW_MODIFY_COA, location = "chartOfAccounts-viewModifyCoa.jsp"), @Result(name = "new", location = "chartOfAccounts-new.jsp"), @Result(name = "detailed-editCode", location = "chartOfAccounts-editCode.jsp"), @Result(name = "detailed-viewCode", location = "chartOfAccounts-viewCode.jsp"), @Result(name = "generated-glcode", location = "chartOfAccounts-generated-glcode.jsp") }) public class ChartOfAccountsAction extends BaseFormAction { private static final long serialVersionUID = 3393565721493478018L; private static final long LONG_FOUR = 4l; private static final long LONG_TWO = 2l; @Autowired @Qualifier("persistenceService") private PersistenceService persistenceService; @Autowired @Qualifier("chartOfAccountsService") private PersistenceService<CChartOfAccounts, Long> chartOfAccountsService; @Autowired @Qualifier("chartOfAccountDetailService") private PersistenceService<CChartOfAccountDetail, Long> chartOfAccountDetailService; CChartOfAccounts model = new CChartOfAccounts(); List<String> accountDetailTypeList = new ArrayList<String>(); List<Accountdetailtype> accountDetailType = new ArrayList<Accountdetailtype>(); private static final Logger LOGGER = Logger.getLogger(ChartOfAccountsAction.class); boolean activeForPosting = false; boolean functionRequired = false; boolean budgetCheckRequired = false; Long coaId; Long parentId; @Autowired AppConfigValueService appConfigValuesService; @Autowired private ChartOfAccounts chartOfAccounts; String glCode = ""; List<CChartOfAccounts> allChartOfAccounts; int majorCodeLength = 0; int minorCodeLength = 0; int subMinorCodeLength = 0; int detailedCodeLength = 0; EgfAccountcodePurpose accountcodePurpose; private String generatedGlcode; String newGlcode; String parentForDetailedCode = ""; private final Map<Long, Integer> glCodeLengths = new HashMap<Long, Integer>(); private boolean updateOnly = false; @Autowired private CoaCache coaCache; @Autowired private ChartOfAccountsHibernateDAO chartOfAccountsHibernateDAO; @Override public Object getModel() { return model; } public ChartOfAccountsAction() { addRelatedEntity("purpose", AccountCodePurpose.class); addRelatedEntity("chartOfAccountDetails.detailTypeId", AccountCodePurpose.class); } @Override public void prepare() { super.prepare(); populateChartOfAccounts(); populateCodeLength(); parentForDetailedCode = getAppConfigValueFor("EGF", "parent_for_detailcode"); populateGlCodeLengths(); allChartOfAccounts = chartOfAccountsService.findAllBy("from CChartOfAccounts where classification=?", Long.valueOf(parentForDetailedCode)); if (model != null) if (accountcodePurpose != null && accountcodePurpose.getId() != null) accountcodePurpose = getPurposeCode(Integer.valueOf(accountcodePurpose.getId())); dropdownData.put("purposeList", persistenceService.findAllBy("from EgfAccountcodePurpose order by name")); dropdownData.put("accountDetailTypeList", persistenceService.findAllBy("from Accountdetailtype order by name")); } private void populateAccountDetailTypeList() { if (model.getChartOfAccountDetails() != null) for (final CChartOfAccountDetail entry : model.getChartOfAccountDetails()) accountDetailTypeList.add(entry.getDetailTypeId().getId().toString()); } void populateGlCodeLengths() { getGlCodeLengths().put(Constants.LONG_ONE, majorCodeLength); getGlCodeLengths().put(LONG_TWO, minorCodeLength - majorCodeLength); getGlCodeLengths().put(3l, subMinorCodeLength - minorCodeLength); if (parentForDetailedCode.equals("2")) getGlCodeLengths().put(LONG_FOUR, detailedCodeLength - minorCodeLength); else if (parentForDetailedCode.equals("3")) getGlCodeLengths().put(LONG_FOUR, detailedCodeLength - subMinorCodeLength); } private EgfAccountcodePurpose getPurposeCode(final Integer id) { return (EgfAccountcodePurpose) persistenceService.find("from EgfAccountcodePurpose where id=?", id); } private void populateChartOfAccounts() { if (model.getId() != null) model = chartOfAccountsService.findById(model.getId(), false); } @Override public String execute() throws Exception { return NEW; } @Action(value = "/masters/chartOfAccounts-view") public String view() throws Exception { populateAccountCodePurpose(); populateAccountDetailTypeList(); populateCoaRequiredFields(); coaId = model.getId(); return Constants.VIEW; } @Action(value = "/masters/chartOfAccounts-viewChartOfAccounts") public String viewChartOfAccounts() throws Exception { populateAccountCodePurpose(); populateAccountDetailTypeList(); populateCoaRequiredFields(); coaId = model.getId(); return Constants.VIEW_COA; } @Action(value = "/masters/chartOfAccounts-modifyChartOfAccounts") public String modifyChartOfAccounts() throws Exception { populateAccountCodePurpose(); populateAccountDetailTypeList(); populateCoaRequiredFields(); coaId = model.getId(); return Constants.VIEW_MODIFY_COA; } public boolean shouldAllowCreation() { return !Long.valueOf("4").equals(model.getClassification()); } @Action(value = "/masters/chartOfAccounts-modify") public String modify() throws Exception { populateAccountDetailTypeList(); populateCoaRequiredFields(); populateAccountCodePurpose(); return Constants.EDIT; } private void populateCoaRequiredFields() { activeForPosting = getIsActiveForPosting(); functionRequired = getFunctionReqd(); budgetCheckRequired = budgetCheckReq(); } private void populateAccountCodePurpose() { if (model != null && model.getPurposeId() != null) accountcodePurpose = getPurposeCode(model.getPurposeId().intValue()); } @Action(value = "/masters/chartOfAccounts-update") public String update() throws Exception { setPurposeOnCoa(); updateOnly = true; populateAccountDetailType(); model.setIsActiveForPosting(activeForPosting); model.setFunctionReqd(functionRequired); model.setBudgetCheckReq(budgetCheckRequired); chartOfAccountsService.persist(model); saveCoaDetails(model); addActionMessage(getText("chartOfAccount.modified.successfully")); clearCache(); coaId = model.getId(); return Constants.VIEW_MODIFY_COA; } private void setPurposeOnCoa() { if (accountcodePurpose != null && accountcodePurpose.getId() != null) model.setPurposeId(accountcodePurpose.getId().longValue()); if (model.getPurposeId() != null && model.getPurposeId().compareTo(0l) == 0) model.setPurposeId(null); } private void populateAccountDetailType() { //persistenceService.setType(Accountdetailtype.class); for (final String row : accountDetailTypeList) accountDetailType.add((Accountdetailtype) persistenceService.find("from Accountdetailtype where id=?", Integer.valueOf(row))); } void deleteAccountDetailType(final List<Accountdetailtype> accountDetailType, final CChartOfAccounts accounts) { String accountDetail = ""; if (accounts.getChartOfAccountDetails() == null) return; chartOfAccountsService.getSession().flush(); //persistenceService.setType(CChartOfAccountDetail.class); try { for (final Accountdetailtype row : accountDetailType) { final Iterator<CChartOfAccountDetail> iterator = accounts.getChartOfAccountDetails().iterator(); while (iterator.hasNext()) { final CChartOfAccountDetail next = iterator.next(); accountDetail = row.getName(); if (next == null || next.getDetailTypeId().getId().equals(row.getId())) { iterator.remove(); chartOfAccountDetailService.delete(chartOfAccountDetailService.findById(next.getId(), false)); persistenceService.getSession().flush(); } } } } catch (final Exception e) { LOGGER.error(e.getMessage(), e); populateAccountDetailTypeList(); final String message = accountDetail.concat(" ").concat(e.toString()); throw new ValidationException(Arrays.asList(new ValidationError(message, message))); } } boolean hasReference(final Integer id, final String glCode) { final SQLQuery query = persistenceService.getSession().createSQLQuery( "select * from chartofaccounts c,generalledger gl,generalledgerdetail gd " + "where c.glcode='" + glCode + "' and gl.glcodeid=c.id and gd.generalledgerid=gl.id and gd.DETAILTYPEID=" + id); final List list = query.list(); if (list != null && list.size() > 0) return true; return false; } boolean validAddtition(final String glCode) { final StringBuffer strQuery = new StringBuffer(); strQuery.append("select bd.billid from eg_billdetails bd, chartofaccounts coa, eg_billregistermis brm where coa.glcode = '" + glCode + "' and bd.glcodeid = coa.id and brm.billid = bd.billid and brm.voucherheaderid is null "); strQuery.append(" intersect SELECT br.id FROM eg_billregister br, eg_billdetails bd, chartofaccounts coa,egw_status sts WHERE coa.glcode = '" + glCode + "' AND bd.glcodeid = coa.id AND br.id= bd.billid AND br.statusid=sts.id "); strQuery.append(" and sts.id not in (select id from egw_status where upper(moduletype) like '%BILL%' and upper(description) like '%CANCELLED%') "); final SQLQuery query = persistenceService.getSession().createSQLQuery(strQuery.toString()); final List list = query.list(); if (list != null && list.size() > 0) return false; return true; } void saveCoaDetails(final CChartOfAccounts accounts) { final List<Accountdetailtype> rowsToBeDeleted = getAccountDetailTypeToBeDeleted(accountDetailType, accounts); final List<Accountdetailtype> rowsToBeAdded = getAccountDetailTypeToBeAdded(accountDetailType, accounts); deleteAccountDetailType(rowsToBeDeleted, accounts); if (accountDetailType.size() == 1 && rowsToBeAdded.size() == 1 && rowsToBeDeleted.size() == 0 && updateOnly) if (!validAddtition(model.getGlcode())) { final String message = getText("chartOfAccount.accDetail.uncancelled.bills"); throw new ValidationException(Arrays.asList(new ValidationError(message, message))); } for (final Accountdetailtype entry : rowsToBeAdded) if (!coaHasAccountdetailtype(entry, accounts)) { final CChartOfAccountDetail chartOfAccountDetail = new CChartOfAccountDetail(); chartOfAccountDetail.setDetailTypeId(entry); chartOfAccountDetail.setGlCodeId(accounts); accounts.getChartOfAccountDetails().add(chartOfAccountDetail); chartOfAccountsService.persist(accounts); } chartOfAccountsService.getSession().flush(); } List<Accountdetailtype> getAccountDetailTypeToBeDeleted(final List<Accountdetailtype> accountDetailType, final CChartOfAccounts accounts) { final List<Accountdetailtype> rowsToBeDeleted = new ArrayList<Accountdetailtype>(); for (final CChartOfAccountDetail entry : accounts.getChartOfAccountDetails()) if (accountDetailType != null && accountDetailType.isEmpty()) rowsToBeDeleted.add(entry.getDetailTypeId()); else if (!accountDetailTypeContains(accountDetailType, entry.getDetailTypeId())) rowsToBeDeleted.add(entry.getDetailTypeId()); return rowsToBeDeleted; } List<Accountdetailtype> getAccountDetailTypeToBeAdded(final List<Accountdetailtype> accountDetailType, final CChartOfAccounts accounts) { final List<Accountdetailtype> rowsToBeAdded = new ArrayList<Accountdetailtype>(); for (final Accountdetailtype row : accountDetailType) if (!coaHasAccountdetailtype(row, accounts)) rowsToBeAdded.add(row); return rowsToBeAdded; } private boolean coaHasAccountdetailtype(final Accountdetailtype entry, final CChartOfAccounts accounts) { for (final CChartOfAccountDetail row : accounts.getChartOfAccountDetails()) if (row.getDetailTypeId().getId().equals(entry.getId())) return true; return false; } private boolean accountDetailTypeContains(final List<Accountdetailtype> list, final Accountdetailtype entry) { for (final Accountdetailtype row : list) if (row.getId().equals(entry.getId())) return true; return false; } @Action(value = "/masters/chartOfAccounts-addNewCoa") public String addNewCoa() throws Exception { model = new CChartOfAccounts(); if (parentId != null) model.setParentId(parentId); final CChartOfAccounts parent = chartOfAccountsService.findById(parentId, false); model.setType(parent.getType()); setClassification(parent); final Long glCode = findNextGlCode(parent); if (parent.getClassification() == null || parent.getClassification() == 0) generatedGlcode = ""; else generatedGlcode = parent.getGlcode(); if (glCode == null) { Long classification=0l; if(glCodeLengths.get(parent.getClassification()+1)==0) { classification=parent.getClassification()+2; }else { classification=parent.getClassification()+1; } populateGlcode(classification); newGlcode = model.getGlcode(); } else { newGlcode = String.valueOf(glCode + 1); if (model.getClassification().equals(LONG_TWO)) newGlcode = newGlcode.substring(majorCodeLength, newGlcode.length()); else if (model.getClassification().equals(3l)) newGlcode = newGlcode.substring(minorCodeLength, newGlcode.length()); else if (model.getClassification().equals(LONG_FOUR)) extractDetailCode(); } return NEW; } private Long findNextGlCode(final CChartOfAccounts parentCoa) { final String glcode = (String) persistenceService.find("select max(glcode) from CChartOfAccounts where parentId=?", parentCoa.getId()); return glcode != null ? Long.valueOf(glcode) : null; } void setClassification(final CChartOfAccounts parentCoa) { if (parentCoa.getClassification() == null) model.setClassification(Constants.LONG_ONE); else if (Constants.LONG_ZERO.equals(parentCoa.getClassification())) model.setClassification(Constants.LONG_ONE); else if (Constants.LONG_ONE.equals(parentCoa.getClassification())) model.setClassification(LONG_TWO); else if (parentCoa.getClassification().equals(LONG_TWO)) { if (parentForDetailedCode.equals("2")) model.setClassification(LONG_FOUR); else model.setClassification(3l); } else if (parentCoa.getClassification().equals(3l)) model.setClassification(LONG_FOUR); } String getAppConfigValueFor(final String module, final String key) { return appConfigValuesService.getConfigValuesByModuleAndKey(module, key).get(0).getValue(); } void populateCodeLength() { majorCodeLength = Integer.valueOf(getAppConfigValueFor(Constants.EGF, "coa_majorcode_length")); minorCodeLength = Integer.valueOf(getAppConfigValueFor(Constants.EGF, "coa_minorcode_length")); subMinorCodeLength = Integer.valueOf(getAppConfigValueFor(Constants.EGF, "coa_subminorcode_length")); detailedCodeLength = Integer.valueOf(getAppConfigValueFor(Constants.EGF, "coa_detailcode_length")); } void populateGlcode(final Long classification) { model.setGlcode(StringUtils.leftPad("", glCodeLengths.get(classification), '0')); } @Action(value = "/masters/chartOfAccounts-save") public String save() throws Exception { if (generatedGlcode == null || newGlcode == null) { addActionMessage(getText("chartOfAccount.invalid.glcode")); return NEW; } final CChartOfAccounts coa = chartOfAccountsService.find("from CChartOfAccounts where glcode=?", generatedGlcode.concat(newGlcode)); if (coa != null) { addActionMessage(getText("chartOfAccount.glcode.already.exists")); return NEW; } model.setGlcode(generatedGlcode.concat(newGlcode)); if ("0".equals(model.getPurposeId())) model.setPurposeId(null); if (parentId != null) { final CChartOfAccounts parent = chartOfAccountsService.findById(parentId, false); model.setParentId(parentId); model.setType(parent.getType()); } setPurposeOnCoa(); model.setIsActiveForPosting(activeForPosting); model.setBudgetCheckReq(budgetCheckRequired); model.setFunctionReqd(functionRequired); populateAccountDetailType(); model.setMajorCode(model.getGlcode().substring(0, majorCodeLength)); chartOfAccountsService.persist(model); saveCoaDetails(model); addActionMessage(getText("chartOfAccount.saved.successfully")); clearCache(); // reset(); coaId = model.getId(); return Constants.VIEW; } private void reset() { activeForPosting = false; budgetCheckRequired = false; functionRequired = false; generatedGlcode = ""; newGlcode = ""; model = new CChartOfAccounts(); } public boolean isActiveForPosting() { return activeForPosting; } public boolean budgetCheckReq() { if (model != null && model.getBudgetCheckReq() != null && model.getBudgetCheckReq()) return true; return false; } public boolean getFunctionReqd() { if (model != null && model.getFunctionReqd() != null && model.getFunctionReqd()) return true; return false; } public boolean getIsActiveForPosting() { if (model != null && model.getIsActiveForPosting() != null && model.getIsActiveForPosting()) return true; return false; } @Action(value = "/masters/chartOfAccounts-editDetailedCode") public String editDetailedCode() throws Exception { allChartOfAccounts = chartOfAccountsHibernateDAO.getDetailedCodesList(); return "detailed-editCode"; } @Action(value = "/masters/chartOfAccounts-viewDetailedCode") public String viewDetailedCode() throws Exception { allChartOfAccounts = chartOfAccountsHibernateDAO.getDetailedCodesList(); return "detailed-viewCode"; } @SkipValidation @Action(value = "/masters/chartOfAccounts-modifySearch") public String modifySearch() throws Exception { if (glCode != null) { model = chartOfAccountsService.find("from CChartOfAccounts where classification=4 and glcode=?", glCode.split("-")[0]); if (model == null) { addActionMessage(getText("charOfAccount.no.record")); return editDetailedCode(); } populateAccountDetailTypeList(); populateCoaRequiredFields(); populateAccountCodePurpose(); return Constants.EDIT; } else { addActionMessage(getText("charOfAccount.no.record")); return editDetailedCode(); } } @SkipValidation @Action(value = "/masters/chartOfAccounts-viewSearch") public String viewSearch() throws Exception { if (glCode != null) { model = chartOfAccountsService.find("from CChartOfAccounts where classification=4 and glcode=?", glCode.split("-")[0]); if (model == null) { addActionMessage(getText("charOfAccount.no.record")); return viewDetailedCode(); } coaId = model.getId(); populateAccountDetailTypeList(); populateCoaRequiredFields(); populateAccountCodePurpose(); return Constants.VIEW_COA; } else { addActionMessage(getText("charOfAccount.no.record")); return viewDetailedCode(); } } @Action(value = "/masters/chartOfAccounts-addNew") public String addNew() throws Exception { populateCodeLength(); model = new CChartOfAccounts(); return "detailed"; } @Action(value = "/masters/chartOfAccounts-create") public String create() throws Exception { if (glCode != null) { final CChartOfAccounts parent = chartOfAccountsService.find("from CChartOfAccounts where glcode=?", glCode.split("-")[0]); if (parent == null) { addActionMessage(getText("chartOfAccount.no.data")); return addNew(); } if (generatedGlcode == null || newGlcode == null) { addActionMessage(getText("chartOfAccount.invalid.glcode")); return "detailed"; } final CChartOfAccounts coa = chartOfAccountsService.find("from CChartOfAccounts where glcode=?", generatedGlcode.concat(newGlcode)); if (coa != null) { addActionMessage(getText("chartOfAccount.glcode.already.exists")); return "detailed"; } parentId = parent.getId(); model.setParentId(parentId); model.setBudgetCheckReq(budgetCheckRequired); model.setFunctionReqd(functionRequired); model.setType(parent.getType()); setClassification(parent); model.setGlcode(generatedGlcode.concat(newGlcode)); model.setMajorCode(model.getGlcode().substring(0, majorCodeLength)); setPurposeOnCoa(); model.setIsActiveForPosting(activeForPosting); populateAccountDetailType(); chartOfAccountsService.persist(model); saveCoaDetails(model); addActionMessage(getText("chartOfAccount.detailed.saved")); } else addActionMessage(getText("chartOfAccount.no.data")); clearCache(); return Constants.VIEW_COA; } public void setGeneratedGlcode(final String generatedGlcode) { this.generatedGlcode = generatedGlcode; } public String getGeneratedGlcode() { return generatedGlcode; } public void setNewGlcode(final String newGlcode) { this.newGlcode = newGlcode; } public String getNewGlcode() { return newGlcode; } @Action(value = "/masters/chartOfAccounts-ajaxNextGlCode") public String ajaxNextGlCode() { final String parentGlcode = parameters.get("parentGlcode")[0]; if (parentGlcode != null || !StringUtils.isBlank(parentGlcode)) { final CChartOfAccounts coa = chartOfAccountsService.find("from CChartOfAccounts where glcode=?", parentGlcode); final Long glCode = findNextGlCode(coa); if (glCode == null) { populateGlcode(coa.getClassification()); newGlcode = model.getGlcode(); } else { newGlcode = String.valueOf(glCode + 1); extractDetailCode(); } } return "generated-glcode"; } void extractDetailCode() { if (parentForDetailedCode.equals("2")) newGlcode = newGlcode.substring(minorCodeLength, newGlcode.length()); else newGlcode = newGlcode.substring(subMinorCodeLength, newGlcode.length()); } public Map<Long, Integer> getGlCodeLengths() { return glCodeLengths; } void clearCache() { try { coaCache.reLoad(); }catch(Exception e) { LOGGER.error("Error while reloading coa cache"); } } public EgfAccountcodePurpose getAccountcodePurpose() { return accountcodePurpose; } public void setAccountcodePurpose(final EgfAccountcodePurpose purposeName) { accountcodePurpose = purposeName; } public List<CChartOfAccounts> getAllChartOfAccounts() { return allChartOfAccounts; } public String getGlCode() { return glCode; } public void setGlCode(final String glCode) { this.glCode = glCode; } public boolean isBudgetCheckRequired() { return budgetCheckRequired; } public boolean isFunctionRequired() { return functionRequired; } public void setBudgetCheckRequired(final boolean budgetCheckReq) { budgetCheckRequired = budgetCheckReq; } public void setFunctionRequired(final boolean functionReqd) { functionRequired = functionReqd; } public Long getCoaId() { return coaId; } public void setCoaId(final Long id) { coaId = id; } public Long getParentId() { return parentId; } public void setParentId(final Long id) { parentId = id; } public void setActiveForPosting(final boolean activeForPosting) { this.activeForPosting = activeForPosting; } public List<String> getAccountDetailTypeList() { return accountDetailTypeList; } public void setAccountDetailTypeList(final List<String> accountDetailTypeList) { this.accountDetailTypeList = accountDetailTypeList; } public List<Accountdetailtype> getAccountDetailType() { return accountDetailType; } public void setAccountDetailType(final List<Accountdetailtype> accountDetailType) { this.accountDetailType = accountDetailType; } public PersistenceService<CChartOfAccounts, Long> getChartOfAccountsService() { return chartOfAccountsService; } public void setChartOfAccountsService(PersistenceService<CChartOfAccounts, Long> chartOfAccountsService) { this.chartOfAccountsService = chartOfAccountsService; } public void setModel(final CChartOfAccounts model) { this.model = model; } }