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.dataaccess.impl;
017    
018    import java.util.ArrayList;
019    import java.util.List;
020    
021    import org.apache.commons.lang.StringUtils;
022    import org.apache.ojb.broker.query.Criteria;
023    import org.apache.ojb.broker.query.QueryFactory;
024    import org.apache.ojb.broker.query.ReportQueryByCriteria;
025    import org.kuali.kfs.module.bc.BCConstants;
026    import org.kuali.kfs.module.bc.BCPropertyConstants;
027    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionFundingLock;
028    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionHeader;
029    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition;
030    import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding;
031    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao;
032    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLockDao;
033    import org.kuali.kfs.sys.KFSPropertyConstants;
034    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
035    
036    /**
037     * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLockDao
038     */
039    public class BudgetConstructionLockDaoOjb extends PlatformAwareDaoBaseOjb implements BudgetConstructionLockDao {
040        private BudgetConstructionDao budgetConstructionDao;
041    
042        /**
043         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLockDao#getAllAccountLocks(java.lang.String)
044         */
045        public List<BudgetConstructionHeader> getAllAccountLocks(String lockUnivId) {
046            Criteria criteria = new Criteria();
047    
048            if (StringUtils.isNotBlank(lockUnivId)) {
049                criteria.addEqualTo(BCPropertyConstants.BUDGET_LOCK_USER_IDENTIFIER, lockUnivId);
050            }
051            else {
052                criteria.addNotNull(BCPropertyConstants.BUDGET_LOCK_USER_IDENTIFIER);
053            }
054            
055            ReportQueryByCriteria query = QueryFactory.newReportQuery(BudgetConstructionHeader.class, criteria);
056            query.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
057            query.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
058            query.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
059            query.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
060            
061            return (List<BudgetConstructionHeader>) getPersistenceBrokerTemplate().getCollectionByQuery(query);
062        }
063    
064        /**
065         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLockDao#getAllPositionFundingLocks(java.lang.String)
066         */
067        public List<PendingBudgetConstructionAppointmentFunding> getAllPositionFundingLocks(String lockUnivId) {
068            Criteria criteria = new Criteria();
069    
070            if (StringUtils.isNotBlank(lockUnivId)) {
071                criteria.addEqualTo(BCPropertyConstants.APPOINTMENT_FUNDING_LOCK_USER_ID, lockUnivId);
072            }
073            else {
074                criteria.addNotNull(BCPropertyConstants.APPOINTMENT_FUNDING_LOCK_USER_ID);
075            }
076    
077            ReportQueryByCriteria query = QueryFactory.newReportQuery(BudgetConstructionFundingLock.class, criteria);
078            query.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
079            query.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
080            query.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
081            query.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
082    
083            List<BudgetConstructionFundingLock> allFundingLocks = (List<BudgetConstructionFundingLock>) getPersistenceBrokerTemplate().getCollectionByQuery(query);
084    
085            List<PendingBudgetConstructionAppointmentFunding> positionFundingLocks = new ArrayList<PendingBudgetConstructionAppointmentFunding>();
086            for (BudgetConstructionFundingLock fundingLock : allFundingLocks) {
087                Criteria criteria2 = new Criteria();
088                criteria2.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fundingLock.getUniversityFiscalYear());
089                criteria2.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, fundingLock.getChartOfAccountsCode());
090                criteria2.addEqualTo(KFSPropertyConstants.ACCOUNT_NUMBER, fundingLock.getAccountNumber());
091                criteria2.addEqualTo(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, fundingLock.getSubAccountNumber());
092                criteria2.addEqualTo(BCPropertyConstants.BUDGET_CONSTRUCTION_POSITION + "." + BCPropertyConstants.POSITION_LOCK_USER_IDENTIFIER, fundingLock.getAppointmentFundingLockUserId());
093    
094                positionFundingLocks.addAll((List<PendingBudgetConstructionAppointmentFunding>) getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(PendingBudgetConstructionAppointmentFunding.class, criteria2)));
095            }
096    
097            return positionFundingLocks;
098        }
099    
100        /**
101         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLockDao#getOrphanedPositionLocks(java.lang.String)
102         */
103        public List<BudgetConstructionPosition> getOrphanedPositionLocks(String lockUnivId) {
104            Criteria criteria = new Criteria();
105    
106            if (StringUtils.isNotBlank(lockUnivId)) {
107                criteria.addEqualTo(BCPropertyConstants.POSITION_LOCK_USER_IDENTIFIER, lockUnivId);
108            }
109            else {
110                criteria.addNotNull(BCPropertyConstants.POSITION_LOCK_USER_IDENTIFIER);
111            }
112            
113            ReportQueryByCriteria query = QueryFactory.newReportQuery(BudgetConstructionPosition.class, criteria);
114            query.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
115            query.addOrderByAscending(BCPropertyConstants.POSITION_NUMBER);
116            
117            List<BudgetConstructionPosition> allPositionLocks = (List<BudgetConstructionPosition>) getPersistenceBrokerTemplate().getCollectionByQuery(query);
118    
119            List<BudgetConstructionPosition> orphanedPositionLocks = new ArrayList<BudgetConstructionPosition>();
120            for (BudgetConstructionPosition position : allPositionLocks) {
121                Criteria criteria2 = new Criteria();
122                criteria2.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, position.getUniversityFiscalYear());
123                criteria2.addEqualTo(BCPropertyConstants.POSITION_NUMBER, position.getPositionNumber());
124                
125                Criteria subCrit = new Criteria();
126                subCrit.addEqualToField(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, Criteria.PARENT_QUERY_PREFIX + KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
127                subCrit.addEqualToField(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, Criteria.PARENT_QUERY_PREFIX + KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
128                subCrit.addEqualToField(KFSPropertyConstants.ACCOUNT_NUMBER, Criteria.PARENT_QUERY_PREFIX + KFSPropertyConstants.ACCOUNT_NUMBER);
129                subCrit.addEqualToField(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, Criteria.PARENT_QUERY_PREFIX + KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
130                subCrit.addEqualTo(BCPropertyConstants.APPOINTMENT_FUNDING_LOCK_USER_ID, position.getPositionLockUserIdentifier());
131                
132                ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(BudgetConstructionFundingLock.class, subCrit);   
133                subQuery.setAttributes(new String[] { "1" });
134                criteria2.addExists(subQuery);
135                
136                List<PendingBudgetConstructionAppointmentFunding> appointmentFundingLocks = (List<PendingBudgetConstructionAppointmentFunding>) getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(PendingBudgetConstructionAppointmentFunding.class, criteria2));
137                if (appointmentFundingLocks == null || appointmentFundingLocks.isEmpty()) {
138                    orphanedPositionLocks.add(position);
139                }
140            }
141    
142            return orphanedPositionLocks;
143        }
144    
145        /**
146         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLockDao#getAllTransactionLocks(java.lang.String)
147         */
148        public List<BudgetConstructionHeader> getAllTransactionLocks(String lockUnivId) {
149            Criteria criteria = new Criteria();
150    
151            if (StringUtils.isNotBlank(lockUnivId)) {
152                criteria.addEqualTo(BCPropertyConstants.BUDGET_TRANSACTION_LOCK_USER_IDENTIFIER, lockUnivId);
153            }
154            else {
155                criteria.addNotNull(BCPropertyConstants.BUDGET_TRANSACTION_LOCK_USER_IDENTIFIER);
156            }
157            
158            ReportQueryByCriteria query = QueryFactory.newReportQuery(BudgetConstructionHeader.class, criteria);
159            query.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
160            query.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
161            query.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
162            query.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
163    
164            return (List<BudgetConstructionHeader>) getPersistenceBrokerTemplate().getCollectionByQuery(query);
165        }
166    
167        /**
168         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLockDao#getOrphanedFundingLocks(java.lang.String)
169         */
170        public List<BudgetConstructionFundingLock> getOrphanedFundingLocks(String lockUnivId) {
171            Criteria criteria = new Criteria();
172    
173            if (StringUtils.isNotBlank(lockUnivId)) {
174                criteria.addEqualTo(BCPropertyConstants.APPOINTMENT_FUNDING_LOCK_USER_ID, lockUnivId);
175            }
176            else {
177                criteria.addNotNull(BCPropertyConstants.APPOINTMENT_FUNDING_LOCK_USER_ID);
178            }
179            
180            ReportQueryByCriteria query = QueryFactory.newReportQuery(BudgetConstructionFundingLock.class, criteria);
181            query.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
182            query.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
183            query.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
184            query.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
185    
186            List<BudgetConstructionFundingLock> allFundingLocks = (List<BudgetConstructionFundingLock>) getPersistenceBrokerTemplate().getCollectionByQuery(query);
187    
188            List<BudgetConstructionFundingLock> orphanedFundingLocks = new ArrayList<BudgetConstructionFundingLock>();
189            for (BudgetConstructionFundingLock fundingLock : allFundingLocks) {
190                String positionNumber = budgetConstructionDao.getPositionAssociatedWithFundingLock(fundingLock);
191                if (BCConstants.POSITION_NUMBER_NOT_FOUND.equals(positionNumber)) {
192                    orphanedFundingLocks.add(fundingLock);
193                }
194            }
195    
196            return orphanedFundingLocks;
197        }
198    
199        /**
200         * Sets the budgetConstructionDao attribute value.
201         * 
202         * @param budgetConstructionDao The budgetConstructionDao to set.
203         */
204        public void setBudgetConstructionDao(BudgetConstructionDao budgetConstructionDao) {
205            this.budgetConstructionDao = budgetConstructionDao;
206        }
207    
208    }