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.dataaccess.impl; 017 018 import java.util.Iterator; 019 020 import org.apache.commons.lang.StringUtils; 021 import org.apache.ojb.broker.query.Criteria; 022 import org.apache.ojb.broker.query.QueryFactory; 023 import org.apache.ojb.broker.query.ReportQueryByCriteria; 024 import org.kuali.kfs.coa.businessobject.Account; 025 import org.kuali.kfs.coa.businessobject.AccountDelegate; 026 import org.kuali.kfs.coa.dataaccess.AccountDelegateDao; 027 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb; 028 import org.kuali.rice.kns.document.MaintenanceLock; 029 import org.kuali.rice.kns.service.DateTimeService; 030 import org.kuali.rice.kns.util.KNSPropertyConstants; 031 032 /** 033 * This class is the OJB implementation of the AccountDelegateDao. 034 */ 035 public class AccountDelegateDaoOjb extends PlatformAwareDaoBaseOjb implements AccountDelegateDao { 036 private DateTimeService dateTimeService; 037 038 /** 039 * 040 * @see org.kuali.kfs.coa.dataaccess.AccountDelegateDao#getLockingDocumentNumber(java.lang.String, java.lang.String) 041 */ 042 043 public String getLockingDocumentNumber(String lockingRepresentation, String documentNumber) { 044 String lockingDocNumber = ""; 045 046 // build the query criteria 047 Criteria criteria = new Criteria(); 048 criteria.addEqualTo("lockingRepresentation", lockingRepresentation); 049 050 // if a docHeaderId is specified, then it will be excluded from the 051 // locking representation test. 052 if (StringUtils.isNotBlank(documentNumber)) { 053 criteria.addNotEqualTo(KNSPropertyConstants.DOCUMENT_NUMBER, documentNumber); 054 } 055 056 // attempt to retrieve a document based off this criteria 057 MaintenanceLock maintenanceLock = (MaintenanceLock) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(MaintenanceLock.class, criteria)); 058 059 // if a document was found, then there's already one out there pending, and 060 // we consider it 'locked' and we return the docnumber. 061 if (maintenanceLock != null) { 062 lockingDocNumber = maintenanceLock.getDocumentNumber(); 063 } 064 return lockingDocNumber; 065 } 066 067 /** 068 * @see org.kuali.kfs.coa.dataaccess.AccountDelegateDao#getAccountDelegationsForPerson(java.lang.String) 069 */ 070 public Iterator<AccountDelegate> getAccountDelegationsForPerson(String principalId, boolean primary) { 071 Criteria criteria = new Criteria(); 072 criteria.addEqualTo("accountDelegateSystemId", principalId); 073 criteria.addEqualTo("active", "Y"); 074 criteria.addEqualTo("accountsDelegatePrmrtIndicator", primary); 075 076 return (Iterator<AccountDelegate>)getPersistenceBrokerTemplate().getIteratorByQuery(QueryFactory.newQuery(AccountDelegate.class, criteria)); 077 } 078 079 /** 080 * @see org.kuali.kfs.coa.dataaccess.AccountDelegateDao#isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(java.lang.String) 081 */ 082 public boolean isPrincipalInAnyWayShapeOrFormPrimaryAccountDelegate(String principalId) { 083 return queryPrincipalIsAccountDelegate(principalId, true); 084 } 085 086 /** 087 * @see org.kuali.kfs.coa.dataaccess.AccountDelegateDao#isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(java.lang.String) 088 */ 089 public boolean isPrincipalInAnyWayShapeOrFormSecondaryAccountDelegate(String principalId) { 090 return queryPrincipalIsAccountDelegate(principalId, false); 091 } 092 093 /** 094 * Determines if any non-closed accounts exist where the principal id is an account delegate 095 * @param principalId the principal id to check 096 * @param primary whether to check primary delegations (if true) or secondary delegations (if false) 097 * @return true if the principal has an account delegation 098 */ 099 protected boolean queryPrincipalIsAccountDelegate(String principalId, boolean primary) { 100 Criteria criteria = new Criteria(); 101 criteria.addEqualTo("accountDelegateSystemId", principalId); 102 criteria.addEqualTo("accountsDelegatePrmrtIndicator", (primary ? "Y" : "N")); 103 criteria.addEqualTo("active", "Y"); 104 criteria.addEqualTo("account.active", "Y"); 105 criteria.addLessOrEqualThan("accountDelegateStartDate", getDateTimeService().getCurrentSqlDate()); 106 107 ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(AccountDelegate.class, criteria); 108 reportQuery.setAttributes(new String[] { "count(*)" }); 109 110 int resultCount = 0; 111 //TODO: getReportQueryIteratorByQuery can be changed to getCount... 112 Iterator iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery); 113 while (iter.hasNext()) { 114 final Object[] results = (Object[])iter.next(); 115 resultCount = (results[0] instanceof Number) ? ((Number)results[0]).intValue() : new Integer(results[0].toString()).intValue(); 116 } 117 return resultCount > 0; 118 } 119 120 /** 121 * Gets the dateTimeService attribute. 122 * @return Returns the dateTimeService. 123 */ 124 public DateTimeService getDateTimeService() { 125 return dateTimeService; 126 } 127 128 /** 129 * Sets the dateTimeService attribute value. 130 * @param dateTimeService The dateTimeService to set. 131 */ 132 public void setDateTimeService(DateTimeService dateTimeService) { 133 this.dateTimeService = dateTimeService; 134 } 135 }