/* * 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.bc.document.dataaccess.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.ojb.broker.PersistenceBroker; import org.apache.ojb.broker.query.Criteria; import org.apache.ojb.broker.query.QueryByCriteria; import org.apache.ojb.broker.query.QueryFactory; import org.apache.ojb.broker.query.ReportQueryByCriteria; import org.kuali.kfs.module.bc.BCConstants; import org.kuali.kfs.module.bc.BCPropertyConstants; import org.kuali.kfs.module.bc.BCConstants.OrgSelControlOption; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionAccountOrganizationHierarchy; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionAccountReports; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionFundingLock; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionHeader; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionOrganizationReports; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPullup; import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding; import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionGeneralLedger; import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.util.TransactionalServiceUtils; import org.kuali.rice.core.api.util.type.KualiInteger; import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; /** * This class is the OJB implementation of the BudgetConstructionDao interface. */ public class BudgetConstructionDaoOjb extends PlatformAwareDaoBaseOjb implements BudgetConstructionDao { /** * This gets a BudgetConstructionHeader using the candidate key chart, account, subaccount, fiscalyear * * @param chartOfAccountsCode * @param accountNumber * @param subAccountNumber * @param fiscalYear * @return BudgetConstructionHeader */ public BudgetConstructionHeader getByCandidateKey(String chartOfAccountsCode, String accountNumber, String subAccountNumber, Integer fiscalYear) { Criteria criteria = new Criteria(); criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode); criteria.addEqualTo("accountNumber", accountNumber); criteria.addEqualTo("subAccountNumber", subAccountNumber); criteria.addEqualTo("universityFiscalYear", fiscalYear); return (BudgetConstructionHeader) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionHeader.class, criteria)); } /** * This deletes a BudgetConstructionFundingLock from the database * * @param budgetConstructionFundingLock */ public void deleteBudgetConstructionFundingLock(BudgetConstructionFundingLock budgetConstructionFundingLock) { getPersistenceBrokerTemplate().delete(budgetConstructionFundingLock); } /** * This gets the set of BudgetConstructionFundingLocks asssociated with a BC EDoc (account). Each BudgetConstructionFundingLock * has the positionNumber dummy attribute set to the associated Position that is locked. A positionNumber value of "NotFnd" * indicates the BudgetConstructionFundingLock is an orphan. * * @param chartOfAccountsCode * @param accountNumber * @param subAccountNumber * @param fiscalYear * @return Collection<BudgetConstructionFundingLock> */ public Collection<BudgetConstructionFundingLock> getFlocksForAccount(String chartOfAccountsCode, String accountNumber, String subAccountNumber, Integer fiscalYear) { Collection<BudgetConstructionFundingLock> fundingLocks; Criteria criteria = new Criteria(); criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode); criteria.addEqualTo("accountNumber", accountNumber); criteria.addEqualTo("subAccountNumber", subAccountNumber); criteria.addEqualTo("universityFiscalYear", fiscalYear); fundingLocks = getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(BudgetConstructionFundingLock.class, criteria)); BudgetConstructionFundingLock fundingLock; Iterator<BudgetConstructionFundingLock> iter = fundingLocks.iterator(); while (iter.hasNext()) { fundingLock = iter.next(); fundingLock.setPositionNumber(getPositionAssociatedWithFundingLock(fundingLock)); } return fundingLocks; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getPositionAssociatedWithFundingLock(org.kuali.kfs.module.bc.businessobject.BudgetConstructionFundingLock) */ public String getPositionAssociatedWithFundingLock(BudgetConstructionFundingLock budgetConstructionFundingLock) { String positionNumber = BCConstants.POSITION_NUMBER_NOT_FOUND; // default if there is no associated position that is locked // (orphaned) Criteria criteria = new Criteria(); criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.chartOfAccountsCode", budgetConstructionFundingLock.getChartOfAccountsCode()); criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.accountNumber", budgetConstructionFundingLock.getAccountNumber()); criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.subAccountNumber", budgetConstructionFundingLock.getSubAccountNumber()); criteria.addEqualTo("pendingBudgetConstructionAppointmentFunding.universityFiscalYear", budgetConstructionFundingLock.getUniversityFiscalYear()); criteria.addEqualTo("positionLockUserIdentifier", budgetConstructionFundingLock.getAppointmentFundingLockUserId()); String[] columns = new String[] { "positionNumber" }; ReportQueryByCriteria q = QueryFactory.newReportQuery(BudgetConstructionPosition.class, columns, criteria, true); PersistenceBroker pb = getPersistenceBroker(true); Iterator<Object[]> iter = pb.getReportQueryIteratorByQuery(q); if (iter.hasNext()) { Object[] objs = TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iter); if (objs[0] != null) { positionNumber = (String) objs[0]; } } return positionNumber; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#deleteBudgetConstructionPullupByUserId(java.lang.String) */ public void deleteBudgetConstructionPullupByUserId(String principalName) { Criteria criteria = new Criteria(); criteria.addEqualTo("principalId", principalName); getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(BudgetConstructionPullup.class, criteria)); } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getBudgetConstructionPullupFlagSetByUserId(java.lang.String) */ public List<BudgetConstructionPullup> getBudgetConstructionPullupFlagSetByUserId(String principalName) { List<BudgetConstructionPullup> orgs = new ArrayList<BudgetConstructionPullup>(); Criteria criteria = new Criteria(); criteria.addEqualTo(KFSPropertyConstants.KUALI_USER_PERSON_UNIVERSAL_IDENTIFIER, principalName); criteria.addGreaterThan("pullFlag", OrgSelControlOption.NO.getKey()); orgs = (List<BudgetConstructionPullup>) getPersistenceBrokerTemplate().getCollectionByQuery(QueryFactory.newQuery(BudgetConstructionPullup.class, criteria)); if (orgs.isEmpty() || orgs.size() == 0) { return Collections.EMPTY_LIST; } return orgs; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getBcPullupChildOrgs(java.lang.String, * java.lang.String, java.lang.String) */ public List<BudgetConstructionPullup> getBudgetConstructionPullupChildOrgs(String principalId, String chartOfAccountsCode, String organizationCode) { List<BudgetConstructionPullup> orgs = new ArrayList<BudgetConstructionPullup>(); Criteria cycleCheckCriteria = new Criteria(); cycleCheckCriteria.addEqualToField("chartOfAccountsCode", "reportsToChartOfAccountsCode"); cycleCheckCriteria.addEqualToField("organizationCode", "reportsToOrganizationCode"); cycleCheckCriteria.setEmbraced(true); cycleCheckCriteria.setNegative(true); Criteria criteria = new Criteria(); criteria.addEqualTo("reportsToChartOfAccountsCode", chartOfAccountsCode); criteria.addEqualTo("reportsToOrganizationCode", organizationCode); criteria.addEqualTo("principalId", principalId); criteria.addAndCriteria(cycleCheckCriteria); QueryByCriteria query = QueryFactory.newQuery(BudgetConstructionPullup.class, criteria); query.addOrderByAscending("organization.organizationName"); orgs = (List<BudgetConstructionPullup>) getPersistenceBrokerTemplate().getCollectionByQuery(query); if (orgs.isEmpty() || orgs.size() == 0) { return Collections.EMPTY_LIST; } return orgs; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getPendingBudgetConstructionAppointmentFundingRequestSum(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionGeneralLedger) */ public KualiInteger getPendingBudgetConstructionAppointmentFundingRequestSum(PendingBudgetConstructionGeneralLedger salaryDetailLine) { KualiInteger salarySum = KualiInteger.ZERO; Criteria criteria = new Criteria(); criteria.addEqualTo("universityFiscalYear", salaryDetailLine.getUniversityFiscalYear()); criteria.addEqualTo("chartOfAccountsCode", salaryDetailLine.getChartOfAccountsCode()); criteria.addEqualTo("accountNumber", salaryDetailLine.getAccountNumber()); criteria.addEqualTo("subAccountNumber", salaryDetailLine.getSubAccountNumber()); criteria.addEqualTo("financialObjectCode", salaryDetailLine.getFinancialObjectCode()); criteria.addEqualTo("financialSubObjectCode", salaryDetailLine.getFinancialSubObjectCode()); String[] columns = new String[] { "financialObjectCode", "financialSubObjectCode", "sum(appointmentRequestedAmount)" }; ReportQueryByCriteria q = QueryFactory.newReportQuery(PendingBudgetConstructionAppointmentFunding.class, columns, criteria, true); q.addGroupBy(new String[] { "financialObjectCode", "financialSubObjectCode" }); PersistenceBroker pb = getPersistenceBroker(true); Iterator<Object[]> iter = pb.getReportQueryIteratorByQuery(q); if (iter.hasNext()) { Object[] objs = TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iter); if (objs[2] != null) { salarySum = new KualiInteger((BigDecimal) objs[2]); } } return salarySum; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getDocumentPBGLFringeLines(java.lang.String, * java.util.List) */ public List getDocumentPBGLFringeLines(String documentNumber, List fringeObjects) { List documentPBGLfringeLines = new ArrayList(); // we probably should just add a clearcache call at the end of all JDBC public methods that update the DB getPersistenceBrokerTemplate().clearCache(); Criteria criteria = new Criteria(); criteria.addEqualTo("documentNumber", documentNumber); criteria.addIn("financialObjectCode", fringeObjects); QueryByCriteria query = QueryFactory.newQuery(PendingBudgetConstructionGeneralLedger.class, criteria); query.addOrderByAscending("financialObjectCode"); documentPBGLfringeLines = (List) getPersistenceBrokerTemplate().getCollectionByQuery(query); return documentPBGLfringeLines; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getAccountOrgHierForAccount(java.lang.String, * java.lang.String, java.lang.Integer) */ public List<BudgetConstructionAccountOrganizationHierarchy> getAccountOrgHierForAccount(String chartOfAccountsCode, String accountNumber, Integer universityFiscalYear) { List<BudgetConstructionAccountOrganizationHierarchy> accountOrgHier = new ArrayList(); Criteria criteria = new Criteria(); criteria.addEqualTo("universityFiscalYear", universityFiscalYear); criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode); criteria.addEqualTo("accountNumber", accountNumber); QueryByCriteria query = QueryFactory.newQuery(BudgetConstructionAccountOrganizationHierarchy.class, criteria); query.addOrderByAscending("organizationLevelCode"); accountOrgHier = (List) getPersistenceBrokerTemplate().getCollectionByQuery(query); return accountOrgHier; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getAccountReports(java.lang.String, java.lang.String) */ public BudgetConstructionAccountReports getAccountReports(String chartOfAccountsCode, String accountNumber) { Criteria criteria = new Criteria(); criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode); criteria.addEqualTo("accountNumber", accountNumber); return (BudgetConstructionAccountReports) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionAccountReports.class, criteria)); } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getOrganizationReports(java.lang.String, * java.lang.String) */ public BudgetConstructionOrganizationReports getOrganizationReports(String chartOfAccountsCode, String organizationCode) { Criteria criteria = new Criteria(); criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode); criteria.addEqualTo("organizationCode", organizationCode); return (BudgetConstructionOrganizationReports) getPersistenceBrokerTemplate().getObjectByQuery(QueryFactory.newQuery(BudgetConstructionOrganizationReports.class, criteria)); } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#insertAccountIntoAccountOrganizationHierarchy(java.lang.String, * java.lang.String, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Integer, java.lang.String, * java.lang.String) */ public boolean insertAccountIntoAccountOrganizationHierarchy(String rootChart, String rootOrganization, Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, Integer currentLevelCode, String organizationChartOfAccountsCode, String organizationCode) { boolean overFlow = false; // insert the level BudgetConstructionAccountOrganizationHierarchy accountOrganizationHierarchy = new BudgetConstructionAccountOrganizationHierarchy(); accountOrganizationHierarchy.setUniversityFiscalYear(universityFiscalYear); accountOrganizationHierarchy.setChartOfAccountsCode(chartOfAccountsCode); accountOrganizationHierarchy.setAccountNumber(accountNumber); accountOrganizationHierarchy.setOrganizationLevelCode(currentLevelCode); accountOrganizationHierarchy.setOrganizationChartOfAccountsCode(organizationChartOfAccountsCode); accountOrganizationHierarchy.setOrganizationCode(organizationCode); getPersistenceBrokerTemplate().store(accountOrganizationHierarchy); // if not currently the root, get the next reports to org, if not overflow call this to insert the next level if (!(rootChart.equalsIgnoreCase(organizationChartOfAccountsCode) && rootOrganization.equalsIgnoreCase(organizationCode))) { if (currentLevelCode < BCConstants.MAXIMUM_ORGANIZATION_TREE_DEPTH) { BudgetConstructionOrganizationReports organizationReports = this.getOrganizationReports(organizationChartOfAccountsCode, organizationCode); if (organizationReports != null) { currentLevelCode++; overFlow = this.insertAccountIntoAccountOrganizationHierarchy(rootChart, rootOrganization, universityFiscalYear, chartOfAccountsCode, accountNumber, currentLevelCode, organizationReports.getReportsToChartOfAccountsCode(), organizationReports.getReportsToOrganizationCode()); } else { // not the root but doesn't exist - done } } else { // overflow overFlow = true; } } return overFlow; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#deleteExistingAccountOrganizationHierarchy(java.lang.Integer, * java.lang.String, java.lang.String) */ public void deleteExistingAccountOrganizationHierarchy(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber) { Criteria criteria = new Criteria(); criteria.addEqualTo("universityFiscalYear", universityFiscalYear); criteria.addEqualTo("chartOfAccountsCode", chartOfAccountsCode); criteria.addEqualTo("accountNumber", accountNumber); getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(BudgetConstructionAccountOrganizationHierarchy.class, criteria)); } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getPBGLSalarySettingRows(java.lang.String, * java.util.List) */ public List getPBGLSalarySettingRows(String documentNumber, List salarySettingObjects) { List pbglSalarySettingRows = new ArrayList(); // need to make sure we are getting the data that was updated by the jdbc benefits calc calls getPersistenceBrokerTemplate().clearCache(); Criteria criteria = new Criteria(); criteria.addEqualTo("documentNumber", documentNumber); criteria.addIn("financialObjectCode", salarySettingObjects); QueryByCriteria query = QueryFactory.newQuery(PendingBudgetConstructionGeneralLedger.class, criteria); pbglSalarySettingRows = (List) getPersistenceBrokerTemplate().getCollectionByQuery(query); return pbglSalarySettingRows; } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao#getAllFundingForPosition(java.lang.Integer, * java.lang.String) */ public List<PendingBudgetConstructionAppointmentFunding> getAllFundingForPosition(Integer universityFiscalYear, String positionNumber) { Criteria criteria = new Criteria(); criteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, universityFiscalYear); criteria.addEqualTo(BCPropertyConstants.POSITION_NUMBER, positionNumber); QueryByCriteria query = QueryFactory.newQuery(PendingBudgetConstructionAppointmentFunding.class, criteria); return (List<PendingBudgetConstructionAppointmentFunding>) getPersistenceBrokerTemplate().getCollectionByQuery(query); } }