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.coa.businessobject; 017 018 import java.util.ArrayList; 019 import java.util.HashMap; 020 import java.util.LinkedHashMap; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.apache.commons.lang.StringUtils; 025 import org.kuali.kfs.coa.service.OrganizationReversionService; 026 import org.kuali.kfs.sys.KFSPropertyConstants; 027 import org.kuali.kfs.sys.businessobject.SystemOptions; 028 import org.kuali.kfs.sys.context.SpringContext; 029 import org.kuali.rice.kns.bo.GlobalBusinessObject; 030 import org.kuali.rice.kns.bo.GlobalBusinessObjectDetail; 031 import org.kuali.rice.kns.bo.PersistableBusinessObject; 032 import org.kuali.rice.kns.bo.PersistableBusinessObjectBase; 033 import org.kuali.rice.kns.service.BusinessObjectService; 034 import org.kuali.rice.kns.service.PersistenceStructureService; 035 import org.kuali.rice.kns.util.TypedArrayList; 036 037 /** 038 * The representation of a Global Organization Reversion. A Global Organization Reversion is made up of three sections: 1. The 039 * University Fiscal Year and Chart of Accounts code for the Organizations going through reversion, with some account information. 040 * 2. A list of the appropriate Object Reversion Details 3. A list of Organizations to apply the Organization Reversion to 041 */ 042 public class OrganizationReversionGlobal extends PersistableBusinessObjectBase implements GlobalBusinessObject { 043 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OrganizationReversionGlobal.class); 044 private String documentNumber; 045 046 private Integer universityFiscalYear; 047 private String budgetReversionChartOfAccountsCode; 048 private String budgetReversionAccountNumber; 049 private Boolean carryForwardByObjectCodeIndicator; 050 private String cashReversionFinancialChartOfAccountsCode; 051 private String cashReversionAccountNumber; 052 053 private Account cashReversionAccount; 054 private Account budgetReversionAccount; 055 private Chart budgetReversionChartOfAccounts; 056 private Chart cashReversionFinancialChartOfAccounts; 057 private SystemOptions universityFiscal; 058 059 private List<OrganizationReversionGlobalDetail> organizationReversionGlobalDetails; 060 private List<OrganizationReversionGlobalOrganization> organizationReversionGlobalOrganizations; 061 062 public OrganizationReversionGlobal() { 063 super(); 064 organizationReversionGlobalDetails = new TypedArrayList(OrganizationReversionGlobalDetail.class); 065 organizationReversionGlobalOrganizations = new TypedArrayList(OrganizationReversionGlobalOrganization.class); 066 } 067 068 /** 069 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper() 070 */ 071 @Override 072 protected LinkedHashMap toStringMapper() { 073 LinkedHashMap stringMapper = new LinkedHashMap(); 074 stringMapper.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.documentNumber); 075 stringMapper.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, this.universityFiscalYear); 076 return stringMapper; 077 } 078 079 /** 080 * Gets the budgetReversionAccount attribute. 081 * 082 * @return Returns the budgetReversionAccount. 083 */ 084 public Account getBudgetReversionAccount() { 085 return budgetReversionAccount; 086 } 087 088 /** 089 * Gets the documentNumber attribute. 090 * 091 * @return Returns the documentNumber. 092 */ 093 public String getDocumentNumber() { 094 return documentNumber; 095 } 096 097 /** 098 * Sets the documentNumber attribute value. 099 * 100 * @param documentNumber The documentNumber to set. 101 */ 102 public void setDocumentNumber(String documentNumber) { 103 this.documentNumber = documentNumber; 104 } 105 106 /** 107 * Sets the budgetReversionAccount attribute value. 108 * 109 * @param budgetReversionAccount The budgetReversionAccount to set. 110 * @deprecated 111 */ 112 public void setBudgetReversionAccount(Account budgetReversionAccount) { 113 this.budgetReversionAccount = budgetReversionAccount; 114 } 115 116 /** 117 * Gets the budgetReversionAccountNumber attribute. 118 * 119 * @return Returns the budgetReversionAccountNumber. 120 */ 121 public String getBudgetReversionAccountNumber() { 122 return budgetReversionAccountNumber; 123 } 124 125 /** 126 * Sets the budgetReversionAccountNumber attribute value. 127 * 128 * @param budgetReversionAccountNumber The budgetReversionAccountNumber to set. 129 */ 130 public void setBudgetReversionAccountNumber(String budgetReversionAccountNumber) { 131 this.budgetReversionAccountNumber = budgetReversionAccountNumber; 132 } 133 134 /** 135 * Gets the budgetReversionChartOfAccounts attribute. 136 * 137 * @return Returns the budgetReversionChartOfAccounts. 138 */ 139 public Chart getBudgetReversionChartOfAccounts() { 140 return budgetReversionChartOfAccounts; 141 } 142 143 /** 144 * Sets the budgetReversionChartOfAccounts attribute value. 145 * 146 * @param budgetReversionChartOfAccounts The budgetReversionChartOfAccounts to set. 147 * @deprecated 148 */ 149 public void setBudgetReversionChartOfAccounts(Chart budgetReversionChartOfAccounts) { 150 this.budgetReversionChartOfAccounts = budgetReversionChartOfAccounts; 151 } 152 153 /** 154 * Gets the budgetReversionChartOfAccountsCode attribute. 155 * 156 * @return Returns the budgetReversionChartOfAccountsCode. 157 */ 158 public String getBudgetReversionChartOfAccountsCode() { 159 return budgetReversionChartOfAccountsCode; 160 } 161 162 /** 163 * Sets the budgetReversionChartOfAccountsCode attribute value. 164 * 165 * @param budgetReversionChartOfAccountsCode The budgetReversionChartOfAccountsCode to set. 166 */ 167 public void setBudgetReversionChartOfAccountsCode(String budgetReversionChartOfAccountsCode) { 168 this.budgetReversionChartOfAccountsCode = budgetReversionChartOfAccountsCode; 169 } 170 171 /** 172 * Gets the carryForwardByObjectCodeIndicator attribute. 173 * 174 * @return Returns the carryForwardByObjectCodeIndicator. 175 */ 176 public Boolean isCarryForwardByObjectCodeIndicator() { 177 return carryForwardByObjectCodeIndicator; 178 } 179 180 /** 181 * Gets the carryForwardByObjectCodeIndicator attribute: but for other methods that don't like to call "is" and would rather 182 * call "get" 183 * 184 * @return Returns the carryForwardByObjectCodeIndicator. 185 */ 186 public Boolean getCarryForwardByObjectCodeIndicator() { 187 return this.isCarryForwardByObjectCodeIndicator(); 188 } 189 190 /** 191 * Sets the carryForwardByObjectCodeIndicator attribute value. 192 * 193 * @param carryForwardByObjectCodeIndicator The carryForwardByObjectCodeIndicator to set. 194 */ 195 public void setCarryForwardByObjectCodeIndicator(Boolean carryForwardByObjectCodeIndicator) { 196 this.carryForwardByObjectCodeIndicator = carryForwardByObjectCodeIndicator; 197 } 198 199 /** 200 * Gets the cashReversionAccount attribute. 201 * 202 * @return Returns the cashReversionAccount. 203 */ 204 public Account getCashReversionAccount() { 205 return cashReversionAccount; 206 } 207 208 /** 209 * Sets the cashReversionAccount attribute value. 210 * 211 * @param cashReversionAccount The cashReversionAccount to set. 212 * @deprecated 213 */ 214 public void setCashReversionAccount(Account cashReversionAccount) { 215 this.cashReversionAccount = cashReversionAccount; 216 } 217 218 /** 219 * Gets the cashReversionAccountNumber attribute. 220 * 221 * @return Returns the cashReversionAccountNumber. 222 */ 223 public String getCashReversionAccountNumber() { 224 return cashReversionAccountNumber; 225 } 226 227 /** 228 * Sets the cashReversionAccountNumber attribute value. 229 * 230 * @param cashReversionAccountNumber The cashReversionAccountNumber to set. 231 */ 232 public void setCashReversionAccountNumber(String cashReversionAccountNumber) { 233 this.cashReversionAccountNumber = cashReversionAccountNumber; 234 } 235 236 /** 237 * Gets the cashReversionFinancialChartOfAccounts attribute. 238 * 239 * @return Returns the cashReversionFinancialChartOfAccounts. 240 */ 241 public Chart getCashReversionFinancialChartOfAccounts() { 242 return cashReversionFinancialChartOfAccounts; 243 } 244 245 /** 246 * Sets the cashReversionFinancialChartOfAccounts attribute value. 247 * 248 * @param cashReversionFinancialChartOfAccounts The cashReversionFinancialChartOfAccounts to set. 249 * @deprecated 250 */ 251 public void setCashReversionFinancialChartOfAccounts(Chart cashReversionFinancialChartOfAccounts) { 252 this.cashReversionFinancialChartOfAccounts = cashReversionFinancialChartOfAccounts; 253 } 254 255 /** 256 * Gets the cashReversionFinancialChartOfAccountsCode attribute. 257 * 258 * @return Returns the cashReversionFinancialChartOfAccountsCode. 259 */ 260 public String getCashReversionFinancialChartOfAccountsCode() { 261 return cashReversionFinancialChartOfAccountsCode; 262 } 263 264 /** 265 * Sets the cashReversionFinancialChartOfAccountsCode attribute value. 266 * 267 * @param cashReversionFinancialChartOfAccountsCode The cashReversionFinancialChartOfAccountsCode to set. 268 */ 269 public void setCashReversionFinancialChartOfAccountsCode(String cashReversionFinancialChartOfAccountsCode) { 270 this.cashReversionFinancialChartOfAccountsCode = cashReversionFinancialChartOfAccountsCode; 271 } 272 273 /** 274 * Gets the organizationReversionGlobalOrganizations attribute. 275 * 276 * @return Returns the organizationReversionGlobalOrganizations. 277 */ 278 public List<OrganizationReversionGlobalOrganization> getOrganizationReversionGlobalOrganizations() { 279 return organizationReversionGlobalOrganizations; 280 } 281 282 /** 283 * Sets the organizationReversionGlobalOrganizations attribute value. 284 * 285 * @param organizationReversionGlobalOrganizations The organizationReversionGlobalOrganizations to set. 286 * @deprecated 287 */ 288 public void setOrganizationReversionGlobalOrganizations(List<OrganizationReversionGlobalOrganization> organizationReversionGlobalOrganizations) { 289 this.organizationReversionGlobalOrganizations = organizationReversionGlobalOrganizations; 290 } 291 292 /** 293 * Gets the organizationReversionGlobalDocumentDetails attribute. 294 * 295 * @return Returns the organizationReversionGlobalDocumentDetails. 296 */ 297 public List<OrganizationReversionGlobalDetail> getOrganizationReversionGlobalDetails() { 298 return organizationReversionGlobalDetails; 299 } 300 301 /** 302 * Sets the organizationReversionGlobalDocumentDetails attribute value. 303 * 304 * @param organizationReversionGlobalDocumentDetails The organizationReversionGlobalDocumentDetails to set. 305 */ 306 public void setOrganizationReversionGlobalDetails(List<OrganizationReversionGlobalDetail> organizationReversionGlobalDetails) { 307 this.organizationReversionGlobalDetails = organizationReversionGlobalDetails; 308 } 309 310 /** 311 * Gets the universityFiscalYear attribute. 312 * 313 * @return Returns the universityFiscalYear. 314 */ 315 public Integer getUniversityFiscalYear() { 316 return universityFiscalYear; 317 } 318 319 /** 320 * Sets the universityFiscalYear attribute value. 321 * 322 * @param universityFiscalYear The universityFiscalYear to set. 323 */ 324 public void setUniversityFiscalYear(Integer universityFiscalYear) { 325 this.universityFiscalYear = universityFiscalYear; 326 } 327 328 /** 329 * Gets the universityFiscal attribute. 330 * 331 * @return Returns the universityFiscal. 332 */ 333 public SystemOptions getUniversityFiscal() { 334 return universityFiscal; 335 } 336 337 /** 338 * Sets the universityFiscal attribute value. 339 * 340 * @param universityFiscal The universityFiscal to set. 341 */ 342 public void setUniversityFiscal(SystemOptions universityFiscal) { 343 this.universityFiscal = universityFiscal; 344 } 345 346 /** 347 * @see org.kuali.rice.kns.bo.GlobalBusinessObject#generateDeactivationsToPersist() As global organization reversions only update 348 * existing records, deactivations will never be produced by creating one; thus, this method always returns an empty list. 349 */ 350 public List<PersistableBusinessObject> generateDeactivationsToPersist() { 351 return null; 352 } 353 354 /** 355 * @see org.kuali.rice.kns.bo.GlobalBusinessObject#generateGlobalChangesToPersist() This creates a list of changes to be made to the 356 * existing Organization Reversion records impacted by this global reversion. 357 */ 358 public List<PersistableBusinessObject> generateGlobalChangesToPersist() { 359 List<PersistableBusinessObject> persistingChanges = new ArrayList<PersistableBusinessObject>(); 360 361 BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class); 362 Map<String, OrganizationReversionGlobalDetail> detailsMap = this.rearrangeOrganizationReversionDetailsAsMap(); 363 364 for (OrganizationReversionGlobalOrganization orgRevOrg : this.getOrganizationReversionGlobalOrganizations()) { 365 // 1. find that organization reversion 366 OrganizationReversion currOrgRev = SpringContext.getBean(OrganizationReversionService.class).getByPrimaryId(this.getUniversityFiscalYear(), orgRevOrg.getChartOfAccountsCode(), orgRevOrg.getOrganizationCode()); 367 368 if (currOrgRev != null) { // only proceed if there's a pre-existing org reversion; we don't want to insert any new 369 // records 370 if (!StringUtils.isBlank(this.getBudgetReversionChartOfAccountsCode())) { 371 currOrgRev.setBudgetReversionChartOfAccountsCode(this.getBudgetReversionChartOfAccountsCode()); 372 } 373 if (!StringUtils.isBlank(this.getBudgetReversionAccountNumber())) { 374 currOrgRev.setBudgetReversionAccountNumber(this.getBudgetReversionAccountNumber()); 375 } 376 if (!StringUtils.isBlank(this.getCashReversionFinancialChartOfAccountsCode())) { 377 currOrgRev.setCashReversionFinancialChartOfAccountsCode(this.getCashReversionFinancialChartOfAccountsCode()); 378 } 379 if (!StringUtils.isBlank(this.getCashReversionAccountNumber())) { 380 currOrgRev.setCashReversionAccountNumber(this.getCashReversionAccountNumber()); 381 } 382 383 if (this.isCarryForwardByObjectCodeIndicator() != null) { 384 currOrgRev.setCarryForwardByObjectCodeIndicator(this.isCarryForwardByObjectCodeIndicator().booleanValue()); 385 } 386 387 // 3. now, go through each org reversion detail and update each of those 388 for (OrganizationReversionDetail orgRevDetail : currOrgRev.getOrganizationReversionDetail()) { 389 OrganizationReversionGlobalDetail changeDetail = detailsMap.get(orgRevDetail.getOrganizationReversionCategoryCode()); 390 if (changeDetail != null) { 391 if (!StringUtils.isBlank(changeDetail.getOrganizationReversionCode())) { 392 orgRevDetail.setOrganizationReversionCode(changeDetail.getOrganizationReversionCode()); 393 } 394 if (!StringUtils.isBlank(changeDetail.getOrganizationReversionObjectCode())) { 395 orgRevDetail.setOrganizationReversionObjectCode(changeDetail.getOrganizationReversionObjectCode()); 396 } 397 } 398 } 399 400 currOrgRev.refreshNonUpdateableReferences(); 401 persistingChanges.add(currOrgRev); 402 } 403 404 } 405 return persistingChanges; 406 } 407 408 /** 409 * This sticks all of the Organization Reversion Change Details into a map, for quicker access in 410 * generateGlobalChangesToPersist. 411 * 412 * @return a map of all organization reversion change details, keyed by OrganizationReversionCategory 413 */ 414 private Map<String, OrganizationReversionGlobalDetail> rearrangeOrganizationReversionDetailsAsMap() { 415 Map<String, OrganizationReversionGlobalDetail> orgRevMap = new HashMap<String, OrganizationReversionGlobalDetail>(); 416 for (OrganizationReversionGlobalDetail orgRevDetail : this.getOrganizationReversionGlobalDetails()) { 417 if (!StringUtils.isBlank(orgRevDetail.getOrganizationReversionObjectCode()) || !StringUtils.isBlank(orgRevDetail.getOrganizationReversionCode())) { 418 orgRevMap.put(orgRevDetail.getOrganizationReversionCategoryCode(), orgRevDetail); 419 } 420 } 421 return orgRevMap; 422 } 423 424 /** 425 * @see org.kuali.rice.kns.bo.GlobalBusinessObject#getAllDetailObjects() This returns a list of all the detail objects held within 426 * this main global organization reversion container. 427 */ 428 public List<? extends GlobalBusinessObjectDetail> getAllDetailObjects() { 429 List<GlobalBusinessObjectDetail> detailObjects = new ArrayList<GlobalBusinessObjectDetail>(); 430 detailObjects.addAll(this.getOrganizationReversionGlobalDetails()); 431 detailObjects.addAll(this.getOrganizationReversionGlobalOrganizations()); 432 return detailObjects; 433 } 434 435 /** 436 * @see org.kuali.rice.kns.bo.GlobalBusinessObject#isPersistable() returns whether this global object reversion can be stored in the 437 * database, which is really a question of whether it and all of its details have all of their appropriate primary keys 438 * set. 439 */ 440 public boolean isPersistable() { 441 PersistenceStructureService persistenceStructureService = SpringContext.getBean(PersistenceStructureService.class); 442 443 if (!persistenceStructureService.hasPrimaryKeyFieldValues(this)) { 444 return false; 445 } 446 447 for (OrganizationReversionGlobalDetail orgRevDetail : this.getOrganizationReversionGlobalDetails()) { 448 if (!persistenceStructureService.hasPrimaryKeyFieldValues(orgRevDetail)) { 449 return false; 450 } 451 } 452 453 for (OrganizationReversionGlobalOrganization orgRevOrg : this.getOrganizationReversionGlobalOrganizations()) { 454 if (!persistenceStructureService.hasPrimaryKeyFieldValues(orgRevOrg)) { 455 return false; 456 } 457 } 458 459 // are we still here? really? Then, hey, let's persist! 460 return true; 461 } 462 463 /** 464 * @see org.kuali.rice.kns.bo.PersistableBusinessObjectBase#buildListOfDeletionAwareLists() 465 */ 466 @Override 467 public List buildListOfDeletionAwareLists() { 468 List<List> managedLists = super.buildListOfDeletionAwareLists(); 469 470 managedLists.add(getOrganizationReversionGlobalDetails()); 471 managedLists.add(getOrganizationReversionGlobalOrganizations()); 472 473 return managedLists; 474 } 475 }