001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.module.bc.document.service.impl;
017
018 import java.util.Iterator;
019 import java.util.List;
020
021 import org.apache.commons.lang.StringUtils;
022 import org.apache.log4j.Logger;
023 import org.kuali.kfs.module.bc.BCConstants.OrgSelControlOption;
024 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrganizationReports;
025 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPullup;
026 import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao;
027 import org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao;
028 import org.kuali.kfs.module.bc.document.service.BudgetConstructionOrganizationReportsService;
029 import org.kuali.kfs.module.bc.document.service.BudgetOrganizationTreeService;
030 import org.kuali.rice.kns.service.BusinessObjectService;
031 import org.kuali.rice.kns.service.PersistenceService;
032 import org.springframework.transaction.annotation.Transactional;
033
034 /**
035 * This class implements the BudgetOrganizationTreeService interface
036 */
037 @Transactional
038 public class BudgetOrganizationTreeServiceImpl implements BudgetOrganizationTreeService {
039 private static Logger LOG = org.apache.log4j.Logger.getLogger(BudgetOrganizationTreeServiceImpl.class);
040
041 private BudgetConstructionOrganizationReportsService budgetConstructionOrganizationReportsService;
042 private BusinessObjectService businessObjectService;
043 private BudgetConstructionDao budgetConstructionDao;
044 private BudgetPullupDao budgetPullupDao;
045
046 // controls used to trap any runaways due to cycles in the reporting tree
047 protected static final int MAXLEVEL = 50;
048 private int curLevel;
049
050 /**
051 * @see org.kuali.kfs.module.bc.document.service.BudgetOrganizationTreeService#buildPullup(java.lang.String, java.lang.String,
052 * java.lang.String)
053 */
054 public void buildPullup(String principalName, String chartOfAccountsCode, String organizationCode) {
055 cleanPullup(principalName);
056 BudgetConstructionOrganizationReports bcOrgRpts = budgetConstructionOrganizationReportsService.getByPrimaryId(chartOfAccountsCode, organizationCode);
057 if (bcOrgRpts != null) {
058 if (bcOrgRpts.getOrganization().isActive()) {
059 curLevel = 0;
060 buildSubTree(principalName, bcOrgRpts, curLevel);
061 }
062 }
063 }
064
065 protected void buildSubTree(String principalName, BudgetConstructionOrganizationReports bcOrgRpts, int curLevel) {
066
067 curLevel++;
068 BudgetConstructionPullup bcPullup = new BudgetConstructionPullup();
069 bcPullup.setPrincipalId(principalName);
070 bcPullup.setChartOfAccountsCode(bcOrgRpts.getChartOfAccountsCode());
071 bcPullup.setOrganizationCode(bcOrgRpts.getOrganizationCode());
072 bcPullup.setReportsToChartOfAccountsCode(bcOrgRpts.getReportsToChartOfAccountsCode());
073 bcPullup.setReportsToOrganizationCode(bcOrgRpts.getReportsToOrganizationCode());
074 bcPullup.setPullFlag(new Integer(0));
075 businessObjectService.save(bcPullup);
076
077 if (curLevel <= MAXLEVEL) {
078 // getActiveChildOrgs does not return orgs that report to themselves
079 List childOrgs = budgetConstructionOrganizationReportsService.getActiveChildOrgs(bcOrgRpts.getChartOfAccountsCode(), bcOrgRpts.getOrganizationCode());
080 if (childOrgs.size() > 0) {
081 for (Iterator iter = childOrgs.iterator(); iter.hasNext();) {
082 BudgetConstructionOrganizationReports bcOrg = (BudgetConstructionOrganizationReports) iter.next();
083 buildSubTree(principalName, bcOrg, curLevel);
084 }
085 }
086 }
087 else {
088 LOG.warn(String.format("\n%s/%s reports to organization more than maxlevel of %d", bcOrgRpts.getChartOfAccountsCode(), bcOrgRpts.getOrganizationCode(), MAXLEVEL));
089 }
090 }
091
092 /**
093 * @see org.kuali.kfs.module.bc.document.service.BudgetOrganizationTreeService#buildPullupSql(java.lang.String,
094 * java.lang.String, java.lang.String)
095 */
096 public void buildPullupSql(String principalName, String chartOfAccountsCode, String organizationCode) {
097 cleanPullup(principalName);
098 BudgetConstructionOrganizationReports bcOrgRpts = budgetConstructionOrganizationReportsService.getByPrimaryId(chartOfAccountsCode, organizationCode);
099 if (bcOrgRpts != null) {
100 if (bcOrgRpts.getOrganization().isActive()) {
101 curLevel = 0;
102 buildSubTreeSql(principalName, bcOrgRpts, curLevel);
103 }
104 }
105 }
106
107 protected void buildSubTreeSql(String principalName, BudgetConstructionOrganizationReports bcOrgRpts, int curLevel) {
108
109 curLevel++;
110 budgetPullupDao.buildSubTree(principalName, bcOrgRpts.getChartOfAccountsCode(), bcOrgRpts.getOrganizationCode(), curLevel);
111 // budgetPullupDao.initPointOfView(principalName, bcOrgRpts.getChartOfAccountsCode(), bcOrgRpts.getOrganizationCode(), curLevel);
112 // budgetPullupDao.insertChildOrgs(principalName, curLevel);
113
114 }
115
116 /**
117 * @see org.kuali.kfs.module.bc.document.service.BudgetOrganizationTreeService#cleanPullup(java.lang.String)
118 */
119 public void cleanPullup(String principalName) {
120
121 // budgetConstructionDao.deleteBudgetConstructionPullupByUserId(principalName);
122 budgetPullupDao.cleanGeneralLedgerObjectSummaryTable(principalName);
123
124 }
125
126 /**
127 * @see org.kuali.kfs.module.bc.document.service.BudgetOrganizationTreeService#getPullupChildOrgs(java.lang.String,
128 * java.lang.String, java.lang.String)
129 */
130 public List<BudgetConstructionPullup> getPullupChildOrgs(String principalId, String chartOfAccountsCode, String organizationCode) {
131
132 if (StringUtils.isBlank(principalId)) {
133 throw new IllegalArgumentException("String parameter principalId was null or blank.");
134 }
135 if (StringUtils.isBlank(chartOfAccountsCode)) {
136 throw new IllegalArgumentException("String parameter chartOfAccountsCode was null or blank.");
137 }
138 if (StringUtils.isBlank(organizationCode)) {
139 throw new IllegalArgumentException("String parameter organizationCode was null or blank.");
140 }
141
142 return (List<BudgetConstructionPullup>) budgetConstructionDao.getBudgetConstructionPullupChildOrgs(principalId, chartOfAccountsCode, organizationCode);
143 }
144
145 /**
146 * @see org.kuali.kfs.module.bc.document.service.BudgetOrganizationTreeService#resetPullFlag(java.lang.String)
147 */
148 public void resetPullFlag(String principalId) {
149
150 if (StringUtils.isBlank(principalId)) {
151 throw new IllegalArgumentException("String parameter principalId was null or blank.");
152 }
153 List<BudgetConstructionPullup> results = budgetConstructionDao.getBudgetConstructionPullupFlagSetByUserId(principalId);
154 if (!results.isEmpty()) {
155 for (BudgetConstructionPullup selOrg : results) {
156 selOrg.setPullFlag(OrgSelControlOption.NO.getKey());
157 }
158 businessObjectService.save(results);
159 }
160
161 }
162
163 /**
164 * @see org.kuali.kfs.module.bc.document.service.BudgetOrganizationTreeService#getSelectedOrgs(java.lang.String)
165 */
166 public List<BudgetConstructionPullup> getSelectedOrgs(String principalId) {
167
168 if (StringUtils.isBlank(principalId)) {
169 throw new IllegalArgumentException("String parameter principalId was null or blank.");
170 }
171 return (List<BudgetConstructionPullup>) budgetConstructionDao.getBudgetConstructionPullupFlagSetByUserId(principalId);
172 }
173
174 /**
175 * Gets the budgetConstructionOrganizationReportsService attribute.
176 *
177 * @return Returns the budgetConstructionOrganizationReportsService.
178 */
179 public BudgetConstructionOrganizationReportsService getBudgetConstructionOrganizationReportsService() {
180 return budgetConstructionOrganizationReportsService;
181 }
182
183 /**
184 * Sets the budgetConstructionOrganizationReportsService attribute value.
185 *
186 * @param budgetConstructionOrganizationReportsService The budgetConstructionOrganizationReportsService to set.
187 */
188 public void setBudgetConstructionOrganizationReportsService(BudgetConstructionOrganizationReportsService budgetConstructionOrganizationReportsService) {
189 this.budgetConstructionOrganizationReportsService = budgetConstructionOrganizationReportsService;
190 }
191
192 /**
193 * Gets the businessObjectService attribute.
194 *
195 * @return Returns the businessObjectService.
196 */
197 public BusinessObjectService getBusinessObjectService() {
198 return businessObjectService;
199 }
200
201 /**
202 * Sets the businessObjectService attribute value.
203 *
204 * @param businessObjectService The businessObjectService to set.
205 */
206 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
207 this.businessObjectService = businessObjectService;
208 }
209
210 /**
211 * Gets the budgetConstructionDao attribute.
212 *
213 * @return Returns the budgetConstructionDao.
214 */
215 public BudgetConstructionDao getBudgetConstructionDao() {
216 return budgetConstructionDao;
217 }
218
219 /**
220 * Sets the budgetConstructionDao attribute value.
221 *
222 * @param budgetConstructionDao The budgetConstructionDao to set.
223 */
224 public void setBudgetConstructionDao(BudgetConstructionDao budgetConstructionDao) {
225 this.budgetConstructionDao = budgetConstructionDao;
226 }
227
228 /**
229 * Gets the budgetPullupDao attribute.
230 *
231 * @return Returns the budgetPullupDao.
232 */
233 public BudgetPullupDao getBudgetPullupDao() {
234 return budgetPullupDao;
235 }
236
237 /**
238 * Sets the budgetPullupDao attribute value.
239 *
240 * @param budgetPullupDao The budgetPullupDao to set.
241 */
242 public void setBudgetPullupDao(BudgetPullupDao budgetPullupDao) {
243 this.budgetPullupDao = budgetPullupDao;
244 }
245
246 }