/* * 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 org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao; /** * This class implemements BudgetPullupDao using Raw Sql */ public class BudgetPullupDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetPullupDao { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetPullupDaoJdbc.class); protected static final int MAXLEVEL = 50; protected static String[] initPointOfViewTemplates = new String[1]; protected static String[] insertChildOrgTemplates = new String[2]; public BudgetPullupDaoJdbc() { StringBuilder sqlText = new StringBuilder(500); sqlText.append("INSERT INTO LD_BCN_PULLUP_T \n"); sqlText.append(" (PERSON_UNVL_ID, FIN_COA_CD, ORG_CD, RPTS_TO_FIN_COA_CD, RPTS_TO_ORG_CD, PULL_FLAG) \n"); sqlText.append("SELECT ?, r.fin_coa_cd, r.org_cd, r.rpts_to_fin_coa_cd, r.rpts_to_org_cd, ? \n"); sqlText.append("FROM LD_BCN_ORG_RPTS_T r \n"); sqlText.append("WHERE fin_coa_cd = ? \n"); sqlText.append(" AND org_cd = ? \n"); initPointOfViewTemplates[0] = sqlText.toString(); sqlText.delete(0, sqlText.length()); sqlText.append("INSERT INTO LD_BCN_PULLUP_T \n"); sqlText.append(" (PERSON_UNVL_ID, FIN_COA_CD, ORG_CD, RPTS_TO_FIN_COA_CD, RPTS_TO_ORG_CD, PULL_FLAG) \n"); sqlText.append("SELECT ?, r.fin_coa_cd, r.org_cd, r.rpts_to_fin_coa_cd, r.rpts_to_org_cd, ? \n"); sqlText.append("FROM LD_BCN_ORG_RPTS_T r, LD_BCN_PULLUP_T p, CA_ORG_T o \n"); sqlText.append("WHERE p.person_unvl_id = ? \n"); sqlText.append(" AND p.pull_flag = ? \n"); sqlText.append(" AND p.fin_coa_cd = r.rpts_to_fin_coa_cd \n"); sqlText.append(" AND p.org_cd = r.rpts_to_org_cd \n"); sqlText.append(" AND not (r.fin_coa_cd = r.rpts_to_fin_coa_cd and r.org_cd = r.rpts_to_org_cd)"); sqlText.append(" AND o.fin_coa_cd = r.fin_coa_cd \n"); sqlText.append(" AND o.org_cd = r.org_cd \n"); sqlText.append(" AND o.org_active_cd = 'Y' \n"); insertChildOrgTemplates[0] = sqlText.toString(); sqlText.delete(0, sqlText.length()); sqlText.append("UPDATE LD_BCN_PULLUP_T \n"); sqlText.append("SET pull_flag = 0 \n"); sqlText.append("WHERE person_unvl_id = ? \n"); insertChildOrgTemplates[1] = sqlText.toString(); } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#buildSubTree(java.lang.String, java.lang.String, * java.lang.String, int) */ public void buildSubTree(String principalName, String chartOfAccountsCode, String organizationCode, int currentLevel) { initPointOfView(principalName, chartOfAccountsCode, organizationCode, currentLevel); insertChildOrgs(principalName, currentLevel); } /** * This method initializes and inserts the root organization using raw SQL. * * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#initPointOfView(java.lang.String, java.lang.String, * java.lang.String, int) */ protected void initPointOfView(String principalName, String chartOfAccountsCode, String organizationCode, int currentLevel) { LOG.debug("initPointOfView() called"); getSimpleJdbcTemplate().update(initPointOfViewTemplates[0], principalName, currentLevel, chartOfAccountsCode, organizationCode); } /** * This method is implemented using RawSql * * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#insertChildOrgs(java.lang.String, int) */ protected void insertChildOrgs(String principalName, int previousLevel) { LOG.debug("insertChildOrgs() called"); if (previousLevel <= MAXLEVEL) { int currentLevel = previousLevel + 1; // insert the children of the organizations at the current level for the user // and then recursively call on the new level int rowsAffected = getSimpleJdbcTemplate().update(insertChildOrgTemplates[0], principalName, currentLevel, principalName, previousLevel); if (rowsAffected > 0) { insertChildOrgs(principalName, currentLevel); } else { // cleanup by resetting the pull_flag to zero for all getSimpleJdbcTemplate().update(insertChildOrgTemplates[1], principalName); } } else { // overrun problem LOG.warn(String.format("\nWarning: One or more selected organizations have reporting organizations more than maxlevel of %d deep.", MAXLEVEL)); } } /** * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#cleanGeneralLedgerObjectSummaryTable(java.lang.String) */ public void cleanGeneralLedgerObjectSummaryTable(String principalName) { this.clearTempTableByUnvlId("LD_BCN_PULLUP_T", "PERSON_UNVL_ID", principalName); } }