/* * 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.validation.impl; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.kuali.kfs.coa.service.AccountService; import org.kuali.kfs.module.ar.businessobject.InvoiceDetailAccountObjectCode; import org.kuali.kfs.module.ar.document.ContractsGrantsInvoiceDocument; import org.kuali.kfs.module.ar.document.validation.SuspensionCategoryBase; /** * Suspension Category that checks to see if the invoice's award has a closed account which still has a current expenditure. */ public class ClosedAccountWithCurrentExpendituresSuspensionCategory extends SuspensionCategoryBase { protected AccountService accountService; /** * @see org.kuali.kfs.module.ar.document.validation.SuspensionCategory#shouldSuspend(org.kuali.kfs.module.ar.document.ContractsGrantsInvoiceDocument) */ @Override public boolean shouldSuspend(ContractsGrantsInvoiceDocument contractsGrantsInvoiceDocument) { // for each InvoiceDetailAccountObjectCode, extract the chart code and account number, and store it in a map // where the key is chart code and value is a set of account numbers (no duplicates). Map<String, Set<String>> map = new HashMap<String, Set<String>>(); for (InvoiceDetailAccountObjectCode invoiceDetailAccountObjectCode : contractsGrantsInvoiceDocument.getInvoiceDetailAccountObjectCodes()) { String chartOfAccountsCode = invoiceDetailAccountObjectCode.getChartOfAccountsCode(); String accountNumber = invoiceDetailAccountObjectCode.getAccountNumber(); if (map.containsKey(chartOfAccountsCode)) { Set<String> set = map.get(chartOfAccountsCode); set.add(accountNumber); } else { Set<String> set = new HashSet<String>(); set.add(accountNumber); map.put(chartOfAccountsCode, set); } } // Then go through the map and check to see if any of them have closed accounts Set<String> keys = map.keySet(); for (String chartOfAccountsCode : keys) { Set<String> values = map.get(chartOfAccountsCode); for (String accountNumber : values) { if (accountService.getByPrimaryId(chartOfAccountsCode, accountNumber).isClosed()) { return true; } } } return false; } public AccountService getAccountService() { return accountService; } public void setAccountService(AccountService accountService) { this.accountService = accountService; } }