/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.ar.document; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.module.ar.ArPropertyConstants; import org.kuali.kfs.module.ar.businessobject.CostCategory; import org.kuali.kfs.module.ar.businessobject.CostCategoryObjectCode; import org.kuali.kfs.module.ar.businessobject.CostCategoryObjectConsolidation; import org.kuali.kfs.module.ar.businessobject.CostCategoryObjectLevel; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.document.FinancialSystemMaintainable; import org.kuali.rice.kns.document.MaintenanceDocument; import org.kuali.rice.krad.bo.BusinessObject; import org.kuali.rice.krad.bo.PersistableBusinessObject; import org.kuali.rice.krad.util.ObjectUtils; /** * Overridden to add informative help message */ public class CostCategoryMaintainableImpl extends FinancialSystemMaintainable { public CostCategoryMaintainableImpl() { super(); initiateInactiveRecordDisplay(); } public CostCategoryMaintainableImpl(PersistableBusinessObject businessObject) { super(businessObject); initiateInactiveRecordDisplay(); } /** * By default, the children record collections will hide inactive records */ protected void initiateInactiveRecordDisplay() { inactiveRecordDisplay.put(ArPropertyConstants.OBJECT_CODES, Boolean.FALSE); inactiveRecordDisplay.put(ArPropertyConstants.OBJECT_LEVELS, Boolean.FALSE); inactiveRecordDisplay.put(ArPropertyConstants.OBJECT_CONSOLIDATIONS, Boolean.FALSE); } /** * Overridden to push the cost category code to all child objects * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#refresh(java.lang.String, java.util.Map, org.kuali.rice.kns.document.MaintenanceDocument) */ @Override public void refresh(String refreshCaller, Map fieldValues, MaintenanceDocument document) { super.refresh(refreshCaller, fieldValues, document); if (StringUtils.equals(KFSConstants.MULTIPLE_VALUE, refreshCaller)) { final String collectionName = (String)fieldValues.get(KFSConstants.LOOKED_UP_COLLECTION_NAME); CostCategory costCategory = (CostCategory)document.getNewMaintainableObject().getBusinessObject(); if (StringUtils.equals(collectionName, ArPropertyConstants.OBJECT_CODES) &&!CollectionUtils.isEmpty(costCategory.getObjectCodes())) { for (CostCategoryObjectCode objectCode : costCategory.getObjectCodes()) { if (StringUtils.isBlank(objectCode.getCategoryCode())) { objectCode.setCategoryCode(costCategory.getCategoryCode()); } } } if (StringUtils.equals(collectionName, ArPropertyConstants.OBJECT_LEVELS) && !CollectionUtils.isEmpty(costCategory.getObjectLevels())) { for (CostCategoryObjectLevel objectLevel : costCategory.getObjectLevels()) { if (StringUtils.isBlank(objectLevel.getCategoryCode())) { objectLevel.setCategoryCode(costCategory.getCategoryCode()); } } } if (StringUtils.equals(collectionName, ArPropertyConstants.OBJECT_CONSOLIDATIONS) && !CollectionUtils.isEmpty(costCategory.getObjectConsolidations())) { for (CostCategoryObjectConsolidation objectConsolidation : costCategory.getObjectConsolidations()) { if (StringUtils.isBlank(objectConsolidation.getCategoryCode())) { objectConsolidation.setCategoryCode(costCategory.getCategoryCode()); } } } if (!ObjectUtils.isNull(document.getOldMaintainableObject()) && !ObjectUtils.isNull(document.getOldMaintainableObject().getBusinessObject())) { CostCategory oldCostCategory = (CostCategory)document.getOldMaintainableObject().getBusinessObject(); if (!sameSize(oldCostCategory.getObjectCodes(), costCategory.getObjectCodes())) { if (oldCostCategory.getObjectCodes() == null) { oldCostCategory.setObjectCodes(new ArrayList<CostCategoryObjectCode>()); } while (oldCostCategory.getObjectCodes().size() < costCategory.getObjectCodes().size()) { CostCategoryObjectCode paddingObjectCode = new CostCategoryObjectCode(); paddingObjectCode.setCategoryCode(oldCostCategory.getCategoryCode()); oldCostCategory.getObjectCodes().add(paddingObjectCode); } } if (!sameSize(oldCostCategory.getObjectLevels(), costCategory.getObjectLevels())) { if (oldCostCategory.getObjectLevels() == null) { oldCostCategory.setObjectLevels(new ArrayList<CostCategoryObjectLevel>()); } while (oldCostCategory.getObjectLevels().size() < costCategory.getObjectLevels().size()) { CostCategoryObjectLevel paddingObjectLevel = new CostCategoryObjectLevel(); paddingObjectLevel.setCategoryCode(oldCostCategory.getCategoryCode()); oldCostCategory.getObjectLevels().add(paddingObjectLevel); } } if (!sameSize(oldCostCategory.getObjectConsolidations(), costCategory.getObjectConsolidations())) { if (oldCostCategory.getObjectConsolidations() == null) { oldCostCategory.setObjectConsolidations(new ArrayList<CostCategoryObjectConsolidation>()); } while (oldCostCategory.getObjectConsolidations().size() < costCategory.getObjectConsolidations().size()) { CostCategoryObjectConsolidation paddingConsolidation = new CostCategoryObjectConsolidation(); paddingConsolidation.setCategoryCode(oldCostCategory.getCategoryCode()); oldCostCategory.getObjectConsolidations().add(paddingConsolidation); } } } } } /** * Determines if two collections are the same size. Being null and having no elements are treated as equivalent * @param a the first collection to check * @param b the second collection to check * @return true if the two Collections are the same size, false otherwise */ protected boolean sameSize(Collection<?> a, Collection<?> b) { if (CollectionUtils.isEmpty(a)) { return CollectionUtils.isEmpty(b); } if (CollectionUtils.isEmpty(b)) { return false; // a isn't empty or we would have returned; therefore, a and b can't be the same size if we're here } return a.size() == b.size(); } /** * Overridden to filter down category code before cost category detail makes it to rules checking * @see org.kuali.kfs.sys.document.FinancialSystemMaintainable#processBeforeAddLine(java.lang.String, java.lang.Class, org.kuali.rice.krad.bo.BusinessObject) */ @Override public void processBeforeAddLine(String colName, Class colClass, BusinessObject bo) { super.processBeforeAddLine(colName, colClass, bo); if (bo instanceof CostCategoryObjectCode) { ((CostCategoryObjectCode)bo).setCategoryCode(((CostCategory)getBusinessObject()).getCategoryCode()); } else if (bo instanceof CostCategoryObjectLevel) { ((CostCategoryObjectLevel)bo).setCategoryCode(((CostCategory)getBusinessObject()).getCategoryCode()); } else if (bo instanceof CostCategoryObjectConsolidation) { ((CostCategoryObjectConsolidation)bo).setCategoryCode(((CostCategory)getBusinessObject()).getCategoryCode()); } } }