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.math.BigDecimal;
019    import java.util.ArrayList;
020    import java.util.Collection;
021    import java.util.Collections;
022    import java.util.HashMap;
023    import java.util.Iterator;
024    import java.util.List;
025    import java.util.Map;
026    
027    import org.apache.ojb.broker.PersistenceBroker;
028    import org.apache.ojb.broker.query.Criteria;
029    import org.apache.ojb.broker.query.QueryByCriteria;
030    import org.apache.ojb.broker.query.QueryFactory;
031    import org.apache.ojb.broker.query.ReportQueryByCriteria;
032    import org.kuali.kfs.coa.businessobject.AccountDelegate;
033    import org.kuali.kfs.integration.ld.LaborLedgerObject;
034    import org.kuali.kfs.module.bc.BCConstants;
035    import org.kuali.kfs.module.bc.BCPropertyConstants;
036    import org.kuali.kfs.module.bc.BCConstants.OrgSelControlOption;
037    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionAccountOrganizationHierarchy;
038    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionAccountReports;
039    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionFundingLock;
040    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionHeader;
041    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrganizationReports;
042    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition;
043    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPullup;
044    import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding;
045    import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionGeneralLedger;
046    import org.kuali.kfs.module.bc.document.BudgetConstructionDocument;
047    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao;
048    import org.kuali.kfs.sys.KFSConstants;
049    import org.kuali.kfs.sys.KFSPropertyConstants;
050    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
051    import org.kuali.rice.kns.service.DataDictionaryService;
052    import org.kuali.rice.kns.service.KualiModuleService;
053    import org.kuali.rice.kns.util.KualiInteger;
054    import org.kuali.rice.kns.util.TransactionalServiceUtils;
055    
056    /**
057     * This class is the OJB implementation of the BudgetConstructionDao interface.
058     */
059    public class BudgetConstructionDaoOjb extends PlatformAwareDaoBaseOjb implements BudgetConstructionDao {
060    
061        private DataDictionaryService dataDictionaryService;
062        private KualiModuleService kualiModuleService;
063    
064        /**
065         * This gets a BudgetConstructionHeader using the candidate key chart, account, subaccount, fiscalyear
066         * 
067         * @param chartOfAccountsCode
068         * @param accountNumber
069         * @param subAccountNumber
070         * @param fiscalYear
071         * @return BudgetConstructionHeader
072         */
073        public BudgetConstructionHeader getByCandidateKey(String chartOfAccountsCode, String accountNumber, String subAccountNumber, Integer fiscalYear) {
074            Criteria criteria = new Criteria();
075            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
076            criteria.addEqualTo("accountNumber", accountNumber);
077            criteria.addEqualTo("subAccountNumber", subAccountNumber);
078            criteria.addEqualTo("universityFiscalYear", fiscalYear);
079    
080            return (BudgetConstructionHeader) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionHeader.class, criteria));
081        }
082    
083        /**
084         * This saves a BudgetConstructionHeader object to the database
085         * 
086         * @param bcHeader
087         */
088        public void saveBudgetConstructionHeader(BudgetConstructionHeader bcHeader) {
089            getPersistenceBrokerTemplate().store(bcHeader);
090        }
091    
092        /**
093         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#saveBudgetConstructionDocument(org.kuali.kfs.module.bc.document.BudgetConstructionDocument)
094         */
095        public void saveBudgetConstructionDocument(BudgetConstructionDocument bcDocument) {
096            getPersistenceBrokerTemplate().store(bcDocument);
097        }
098    
099        /**
100         * This gets a BudgetConstructionFundingLock using the primary key chart, account, subaccount, fiscalyear, pUId
101         * 
102         * @param chartOfAccountsCode
103         * @param accountNumber
104         * @param subAccountNumber
105         * @param fiscalYear
106         * @param principalId
107         * @return BudgetConstructionFundingLock
108         */
109        public BudgetConstructionFundingLock getByPrimaryId(String chartOfAccountsCode, String accountNumber, String subAccountNumber, Integer fiscalYear, String principalId) {
110            // LOG.debug("getByPrimaryId() started");
111    
112            Criteria criteria = new Criteria();
113            criteria.addEqualTo("appointmentFundingLockUserId", principalId);
114            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
115            criteria.addEqualTo("accountNumber", accountNumber);
116            criteria.addEqualTo("subAccountNumber", subAccountNumber);
117            criteria.addEqualTo("universityFiscalYear", fiscalYear);
118    
119            return (BudgetConstructionFundingLock) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionFundingLock.class, criteria));
120        }
121    
122        /**
123         * This saves a BudgetConstructionFundingLock to the database
124         * 
125         * @param budgetConstructionFundingLock
126         */
127        public void saveBudgetConstructionFundingLock(BudgetConstructionFundingLock budgetConstructionFundingLock) {
128            getPersistenceBrokerTemplate().store(budgetConstructionFundingLock);
129        }
130    
131        /**
132         * This deletes a BudgetConstructionFundingLock from the database
133         * 
134         * @param budgetConstructionFundingLock
135         */
136        public void deleteBudgetConstructionFundingLock(BudgetConstructionFundingLock budgetConstructionFundingLock) {
137            getPersistenceBrokerTemplate().delete(budgetConstructionFundingLock);
138        }
139    
140        /**
141         * This gets the set of BudgetConstructionFundingLocks asssociated with a BC EDoc (account). Each BudgetConstructionFundingLock
142         * has the positionNumber dummy attribute set to the associated Position that is locked. A positionNumber value of "NotFnd"
143         * indicates the BudgetConstructionFundingLock is an orphan.
144         * 
145         * @param chartOfAccountsCode
146         * @param accountNumber
147         * @param subAccountNumber
148         * @param fiscalYear
149         * @return Collection<BudgetConstructionFundingLock>
150         */
151        public Collection<BudgetConstructionFundingLock> getFlocksForAccount(String chartOfAccountsCode, String accountNumber, String subAccountNumber, Integer fiscalYear) {
152            Collection<BudgetConstructionFundingLock> fundingLocks;
153    
154            Criteria criteria = new Criteria();
155            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
156            criteria.addEqualTo("accountNumber", accountNumber);
157            criteria.addEqualTo("subAccountNumber", subAccountNumber);
158            criteria.addEqualTo("universityFiscalYear", fiscalYear);
159    
160            fundingLocks = (Collection<BudgetConstructionFundingLock>) getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(BudgetConstructionFundingLock.class, criteria));
161            BudgetConstructionFundingLock fundingLock;
162            Iterator<BudgetConstructionFundingLock> iter = fundingLocks.iterator();
163            while (iter.hasNext()) {
164                fundingLock = iter.next();
165                fundingLock.setPositionNumber(getPositionAssociatedWithFundingLock(fundingLock));
166            }
167    
168            return fundingLocks;
169        }
170    
171        /**
172         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getPositionAssociatedWithFundingLock(org.kuali.kfs.module.bc.businessobject.BudgetConstructionFundingLock)
173         */
174        public String getPositionAssociatedWithFundingLock(BudgetConstructionFundingLock budgetConstructionFundingLock) {
175    
176            String positionNumber = BCConstants.POSITION_NUMBER_NOT_FOUND; // default if there is no associated position that is locked
177            // (orphaned)
178    
179            Criteria criteria = new Criteria();
180            criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.chartOfAccountsCode", budgetConstructionFundingLock.getChartOfAccountsCode());
181            criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.accountNumber", budgetConstructionFundingLock.getAccountNumber());
182            criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.subAccountNumber", budgetConstructionFundingLock.getSubAccountNumber());
183            criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.universityFiscalYear", budgetConstructionFundingLock.getUniversityFiscalYear());
184            criteria.addEqualTo("positionLockUserIdentifier", budgetConstructionFundingLock.getAppointmentFundingLockUserId());
185            String[] columns = new String[] { "positionNumber" };
186            ReportQueryByCriteria q = QueryFactory.newReportQuery(BudgetConstructionPosition.class, columns, criteria, true);
187            PersistenceBroker pb = getPersistenceBroker(true);
188    
189            Iterator<Object[]> iter = pb.getReportQueryIteratorByQuery(q);
190    
191            if (iter.hasNext()) {
192                Object[] objs = (Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iter);
193                if (objs[0] != null) {
194                    positionNumber = (String) objs[0];
195                }
196            }
197            return positionNumber;
198        }
199    
200        /**
201         * Gets a BudgetConstructionPosition from the database by the primary key positionNumber, fiscalYear
202         * 
203         * @param positionNumber
204         * @param fiscalYear
205         * @return BudgetConstructionPosition
206         */
207        public BudgetConstructionPosition getByPrimaryId(String positionNumber, Integer fiscalYear) {
208            // LOG.debug("getByPrimaryId() started");
209    
210            Criteria criteria = new Criteria();
211            criteria.addEqualTo("positionNumber", positionNumber);
212            criteria.addEqualTo("universityFiscalYear", fiscalYear);
213    
214            return (BudgetConstructionPosition) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionPosition.class, criteria));
215        }
216    
217        /**
218         * Saves a BudgetConstructionPosition to the database
219         * 
220         * @param bcPosition
221         */
222        public void saveBudgetConstructionPosition(BudgetConstructionPosition bcPosition) {
223            getPersistenceBrokerTemplate().store(bcPosition);
224        }
225    
226        /**
227         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#deleteBudgetConstructionPullupByUserId(java.lang.String)
228         */
229        public void deleteBudgetConstructionPullupByUserId(String principalName) {
230    
231            Criteria criteria = new Criteria();
232            criteria.addEqualTo("principalId", principalName);
233            getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(BudgetConstructionPullup.class, criteria));
234    
235        }
236    
237        /**
238         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getBudgetConstructionPullupFlagSetByUserId(java.lang.String)
239         */
240        public List<BudgetConstructionPullup> getBudgetConstructionPullupFlagSetByUserId(String principalName) {
241            List<BudgetConstructionPullup> orgs = new ArrayList<BudgetConstructionPullup>();
242    
243            Criteria criteria = new Criteria();
244            criteria.addEqualTo(KFSPropertyConstants.KUALI_USER_PERSON_UNIVERSAL_IDENTIFIER, principalName);
245            criteria.addGreaterThan("pullFlag", OrgSelControlOption.NO.getKey());
246            orgs = (List<BudgetConstructionPullup>) getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(BudgetConstructionPullup.class, criteria));
247            if (orgs.isEmpty() || orgs.size() == 0) {
248                return (List<BudgetConstructionPullup>)Collections.EMPTY_LIST;
249            }
250            return orgs;
251        }
252    
253        /**
254         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getBcPullupChildOrgs(java.lang.String,
255         *      java.lang.String, java.lang.String)
256         */
257        public List<BudgetConstructionPullup> getBudgetConstructionPullupChildOrgs(String principalId, String chartOfAccountsCode, String organizationCode) {
258            List<BudgetConstructionPullup> orgs = new ArrayList<BudgetConstructionPullup>();
259    
260            Criteria cycleCheckCriteria = new Criteria();
261            cycleCheckCriteria.addEqualToField("chartOfAccountsCode", "reportsToChartOfAccountsCode");
262            cycleCheckCriteria.addEqualToField("organizationCode", "reportsToOrganizationCode");
263            cycleCheckCriteria.setEmbraced(true);
264            cycleCheckCriteria.setNegative(true);
265    
266            Criteria criteria = new Criteria();
267            criteria.addEqualTo("reportsToChartOfAccountsCode", chartOfAccountsCode);
268            criteria.addEqualTo("reportsToOrganizationCode", organizationCode);
269            criteria.addEqualTo("principalId", principalId);
270            criteria.addAndCriteria(cycleCheckCriteria);
271    
272            QueryByCriteria query = QueryFactory.newQuery(BudgetConstructionPullup.class, criteria);
273            query.addOrderByAscending("organization.organizationName");
274    
275            orgs = (List<BudgetConstructionPullup>) getPersistenceBrokerTemplate().getCollectionByQuery(query);
276    
277            if (orgs.isEmpty() || orgs.size() == 0) {
278                return (List<BudgetConstructionPullup>) Collections.EMPTY_LIST;
279            }
280            return orgs;
281        }
282    
283        /**
284         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getPendingBudgetConstructionAppointmentFundingRequestSum(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionGeneralLedger)
285         */
286        public KualiInteger getPendingBudgetConstructionAppointmentFundingRequestSum(PendingBudgetConstructionGeneralLedger salaryDetailLine) {
287            KualiInteger salarySum = KualiInteger.ZERO;
288    
289            Criteria criteria = new Criteria();
290            criteria.addEqualTo("universityFiscalYear", salaryDetailLine.getUniversityFiscalYear());
291            criteria.addEqualTo("chartOfAccountsCode", salaryDetailLine.getChartOfAccountsCode());
292            criteria.addEqualTo("accountNumber", salaryDetailLine.getAccountNumber());
293            criteria.addEqualTo("subAccountNumber", salaryDetailLine.getSubAccountNumber());
294            criteria.addEqualTo("financialObjectCode", salaryDetailLine.getFinancialObjectCode());
295            criteria.addEqualTo("financialSubObjectCode", salaryDetailLine.getFinancialSubObjectCode());
296            String[] columns = new String[] { "financialObjectCode", "financialSubObjectCode", "sum(appointmentRequestedAmount)" };
297            ReportQueryByCriteria q = QueryFactory.newReportQuery(PendingBudgetConstructionAppointmentFunding.class, columns, criteria, true);
298            q.addGroupBy(new String[] { "financialObjectCode", "financialSubObjectCode" });
299            PersistenceBroker pb = getPersistenceBroker(true);
300    
301            Iterator<Object[]> iter = pb.getReportQueryIteratorByQuery(q);
302    
303            if (iter.hasNext()) {
304                Object[] objs = (Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iter);
305                if (objs[2] != null) {
306                    salarySum = new KualiInteger((BigDecimal) objs[2]);
307                }
308            }
309            return salarySum;
310        }
311    
312    
313        /**
314         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getDocumentPBGLFringeLines(java.lang.String,
315         *      java.util.List)
316         */
317        public List getDocumentPBGLFringeLines(String documentNumber, List fringeObjects) {
318            List documentPBGLfringeLines = new ArrayList();
319    
320            // we probably should just add a clearcache call at the end of all JDBC public methods that update the DB
321            getPersistenceBrokerTemplate().clearCache();
322    
323            Criteria criteria = new Criteria();
324            criteria.addEqualTo("documentNumber", documentNumber);
325            criteria.addIn("financialObjectCode", fringeObjects);
326            QueryByCriteria query = QueryFactory.newQuery(PendingBudgetConstructionGeneralLedger.class, criteria);
327            query.addOrderByAscending("financialObjectCode");
328            documentPBGLfringeLines = (List) getPersistenceBrokerTemplate().getCollectionByQuery(query);
329    
330            return documentPBGLfringeLines;
331        }
332    
333        /**
334         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#isDelegate(java.lang.String, java.lang.String,
335         *      java.lang.String)
336         */
337        public boolean isDelegate(String chartOfAccountsCode, String accountNumber, String principalId) {
338    
339            boolean retval = false;
340    
341            // active BC account delegates are marked with the BC document type or the special "ALL" document type
342            List docTypes = new ArrayList();
343            docTypes.add(BCConstants.DOCUMENT_TYPE_CODE_ALL);
344            docTypes.add(KFSConstants.FinancialDocumentTypeCodes.BUDGET_CONSTRUCTION);
345    
346            Criteria criteria = new Criteria();
347            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
348            criteria.addEqualTo("accountNumber", accountNumber);
349            criteria.addEqualTo("accountDelegateSystemId", principalId);
350            criteria.addEqualTo("active", "Y");
351            criteria.addIn("financialDocumentTypeCode", docTypes);
352            QueryByCriteria query = QueryFactory.newQuery(AccountDelegate.class, criteria);
353            if (getPersistenceBrokerTemplate().getCount(query) > 0) {
354                retval = true;
355            }
356    
357            return retval;
358        }
359    
360        /**
361         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getAccountOrgHierForAccount(java.lang.String,
362         *      java.lang.String, java.lang.Integer)
363         */
364        public List<BudgetConstructionAccountOrganizationHierarchy> getAccountOrgHierForAccount(String chartOfAccountsCode, String accountNumber, Integer universityFiscalYear) {
365            List<BudgetConstructionAccountOrganizationHierarchy> accountOrgHier = new ArrayList();
366    
367            Criteria criteria = new Criteria();
368            criteria.addEqualTo("universityFiscalYear", universityFiscalYear);
369            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
370            criteria.addEqualTo("accountNumber", accountNumber);
371    
372            QueryByCriteria query = QueryFactory.newQuery(BudgetConstructionAccountOrganizationHierarchy.class, criteria);
373            query.addOrderByAscending("organizationLevelCode");
374    
375            accountOrgHier = (List) getPersistenceBrokerTemplate().getCollectionByQuery(query);
376    
377    
378            return accountOrgHier;
379        }
380    
381        /**
382         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getAccountReports(java.lang.String, java.lang.String)
383         */
384        public BudgetConstructionAccountReports getAccountReports(String chartOfAccountsCode, String accountNumber) {
385    
386            Criteria criteria = new Criteria();
387            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
388            criteria.addEqualTo("accountNumber", accountNumber);
389    
390            return (BudgetConstructionAccountReports) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionAccountReports.class, criteria));
391        }
392    
393        /**
394         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getOrganizationReports(java.lang.String,
395         *      java.lang.String)
396         */
397        public BudgetConstructionOrganizationReports getOrganizationReports(String chartOfAccountsCode, String organizationCode) {
398    
399            Criteria criteria = new Criteria();
400            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
401            criteria.addEqualTo("organizationCode", organizationCode);
402    
403            return (BudgetConstructionOrganizationReports) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionOrganizationReports.class, criteria));
404        }
405    
406        /**
407         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#insertAccountIntoAccountOrganizationHierarchy(java.lang.String,
408         *      java.lang.String, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Integer, java.lang.String,
409         *      java.lang.String)
410         */
411        public boolean insertAccountIntoAccountOrganizationHierarchy(String rootChart, String rootOrganization, Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, Integer currentLevelCode, String organizationChartOfAccountsCode, String organizationCode) {
412    
413            boolean overFlow = false;
414    
415            // insert the level
416            BudgetConstructionAccountOrganizationHierarchy accountOrganizationHierarchy = new BudgetConstructionAccountOrganizationHierarchy();
417            accountOrganizationHierarchy.setUniversityFiscalYear(universityFiscalYear);
418            accountOrganizationHierarchy.setChartOfAccountsCode(chartOfAccountsCode);
419            accountOrganizationHierarchy.setAccountNumber(accountNumber);
420            accountOrganizationHierarchy.setOrganizationLevelCode(currentLevelCode);
421            accountOrganizationHierarchy.setOrganizationChartOfAccountsCode(organizationChartOfAccountsCode);
422            accountOrganizationHierarchy.setOrganizationCode(organizationCode);
423            getPersistenceBrokerTemplate().store(accountOrganizationHierarchy);
424    
425            // if not currently the root, get the next reports to org, if not overflow call this to insert the next level
426            if (!(rootChart.equalsIgnoreCase(organizationChartOfAccountsCode) && rootOrganization.equalsIgnoreCase(organizationCode))) {
427                if (currentLevelCode < BCConstants.MAXIMUM_ORGANIZATION_TREE_DEPTH) {
428                    BudgetConstructionOrganizationReports organizationReports = this.getOrganizationReports(organizationChartOfAccountsCode, organizationCode);
429                    if (organizationReports != null) {
430                        currentLevelCode++;
431                        overFlow = this.insertAccountIntoAccountOrganizationHierarchy(rootChart, rootOrganization, universityFiscalYear, chartOfAccountsCode, accountNumber, currentLevelCode, organizationReports.getReportsToChartOfAccountsCode(), organizationReports.getReportsToOrganizationCode());
432                    }
433                    else {
434                        // not the root but doesn't exist - done
435                    }
436                }
437                else {
438                    // overflow
439                    overFlow = true;
440                }
441            }
442            return overFlow;
443        }
444    
445        /**
446         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#deleteExistingAccountOrganizationHierarchy(java.lang.Integer,
447         *      java.lang.String, java.lang.String)
448         */
449        public void deleteExistingAccountOrganizationHierarchy(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber) {
450    
451            Criteria criteria = new Criteria();
452            criteria.addEqualTo("universityFiscalYear", universityFiscalYear);
453            criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode);
454            criteria.addEqualTo("accountNumber", accountNumber);
455            getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(BudgetConstructionAccountOrganizationHierarchy.class, criteria));
456        }
457    
458        /**
459         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getDetailSalarySettingLaborObjects(java.lang.Integer,
460         *      java.lang.String)
461         */
462        public List<String> getDetailSalarySettingLaborObjects(Integer universityFiscalYear, String chartOfAccountsCode) {
463            List<String> detailSalarySettingObjects = new ArrayList<String>();
464    
465            Map<String, Object> laborObjectCodeMap = new HashMap<String, Object>();
466            laborObjectCodeMap.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, universityFiscalYear);
467            laborObjectCodeMap.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
468            laborObjectCodeMap.put(KFSPropertyConstants.DETAIL_POSITION_REQUIRED_INDICATOR, true);
469            List<LaborLedgerObject> laborLedgerObjects = kualiModuleService.getResponsibleModuleService(LaborLedgerObject.class).getExternalizableBusinessObjectsList(LaborLedgerObject.class, laborObjectCodeMap);
470    
471            for (LaborLedgerObject laborObject : laborLedgerObjects) {
472                detailSalarySettingObjects.add(laborObject.getFinancialObjectCode());
473            }
474    
475            return detailSalarySettingObjects;
476        }
477    
478        /**
479         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getPBGLSalarySettingRows(java.lang.String,
480         *      java.util.List)
481         */
482        public List getPBGLSalarySettingRows(String documentNumber, List salarySettingObjects) {
483            List pbglSalarySettingRows = new ArrayList();
484    
485            // need to make sure we are getting the data that was updated by the jdbc benefits calc calls
486            getPersistenceBrokerTemplate().clearCache();
487    
488            Criteria criteria = new Criteria();
489            criteria.addEqualTo("documentNumber", documentNumber);
490            criteria.addIn("financialObjectCode", salarySettingObjects);
491            QueryByCriteria query = QueryFactory.newQuery(PendingBudgetConstructionGeneralLedger.class, criteria);
492            pbglSalarySettingRows = (List) getPersistenceBrokerTemplate().getCollectionByQuery(query);
493    
494            return pbglSalarySettingRows;
495        }
496    
497        /**
498         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getAllFundingForPosition(java.lang.Integer,
499         *      java.lang.String)
500         */
501        public List<PendingBudgetConstructionAppointmentFunding> getAllFundingForPosition(Integer universityFiscalYear, String positionNumber) {
502            Criteria criteria = new Criteria();
503            criteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, universityFiscalYear);
504            criteria.addEqualTo(BCPropertyConstants.POSITION_NUMBER, positionNumber);
505    
506            QueryByCriteria query = QueryFactory.newQuery(PendingBudgetConstructionAppointmentFunding.class, criteria);
507    
508            return (List<PendingBudgetConstructionAppointmentFunding>) getPersistenceBrokerTemplate().getCollectionByQuery(query);
509        }
510    
511        /**
512         * Sets the kualiModuleService attribute value.
513         * 
514         * @param kualiModuleService The kualiModuleService to set.
515         */
516        public void setKualiModuleService(KualiModuleService kualiModuleService) {
517            this.kualiModuleService = kualiModuleService;
518        }
519    
520        /**
521         * Gets the dataDictionaryService attribute. 
522         * @return Returns the dataDictionaryService.
523         */
524        public DataDictionaryService getDataDictionaryService() {
525            return dataDictionaryService;
526        }
527    
528        /**
529         * Sets the dataDictionaryService attribute value.
530         * @param dataDictionaryService The dataDictionaryService to set.
531         */
532        public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
533            this.dataDictionaryService = dataDictionaryService;
534        }
535    
536    }
537