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 org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao;
019 import org.kuali.rice.kns.service.PersistenceService;
020
021 /**
022 * This class implemements BudgetPullupDao using Raw Sql
023 */
024 public class BudgetPullupDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetPullupDao {
025
026 private PersistenceService persistenceService;
027
028 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetPullupDaoJdbc.class);
029 private static final int MAXLEVEL = 50;
030
031 private static String[] initPointOfViewTemplates = new String[1];
032 private static String[] insertChildOrgTemplates = new String[2];
033
034 public BudgetPullupDaoJdbc() {
035
036 StringBuilder sqlText = new StringBuilder(500);
037 sqlText.append("INSERT INTO LD_BCN_PULLUP_T \n");
038 sqlText.append(" (PERSON_UNVL_ID, FIN_COA_CD, ORG_CD, RPTS_TO_FIN_COA_CD, RPTS_TO_ORG_CD, PULL_FLAG) \n");
039 sqlText.append("SELECT ?, r.fin_coa_cd, r.org_cd, r.rpts_to_fin_coa_cd, r.rpts_to_org_cd, ? \n");
040 sqlText.append("FROM LD_BCN_ORG_RPTS_T r \n");
041 sqlText.append("WHERE fin_coa_cd = ? \n");
042 sqlText.append(" AND org_cd = ? \n");
043 initPointOfViewTemplates[0] = sqlText.toString();
044 sqlText.delete(0, sqlText.length());
045
046 sqlText.append("INSERT INTO LD_BCN_PULLUP_T \n");
047 sqlText.append(" (PERSON_UNVL_ID, FIN_COA_CD, ORG_CD, RPTS_TO_FIN_COA_CD, RPTS_TO_ORG_CD, PULL_FLAG) \n");
048 sqlText.append("SELECT ?, r.fin_coa_cd, r.org_cd, r.rpts_to_fin_coa_cd, r.rpts_to_org_cd, ? \n");
049 sqlText.append("FROM LD_BCN_ORG_RPTS_T r, LD_BCN_PULLUP_T p, CA_ORG_T o \n");
050 sqlText.append("WHERE p.person_unvl_id = ? \n");
051 sqlText.append(" AND p.pull_flag = ? \n");
052 sqlText.append(" AND p.fin_coa_cd = r.rpts_to_fin_coa_cd \n");
053 sqlText.append(" AND p.org_cd = r.rpts_to_org_cd \n");
054 sqlText.append(" AND not (r.fin_coa_cd = r.rpts_to_fin_coa_cd and r.org_cd = r.rpts_to_org_cd)");
055 sqlText.append(" AND o.fin_coa_cd = r.fin_coa_cd \n");
056 sqlText.append(" AND o.org_cd = r.org_cd \n");
057 sqlText.append(" AND o.org_active_cd = 'Y' \n");
058 insertChildOrgTemplates[0] = sqlText.toString();
059 sqlText.delete(0, sqlText.length());
060
061 sqlText.append("UPDATE LD_BCN_PULLUP_T \n");
062 sqlText.append("SET pull_flag = 0 \n");
063 sqlText.append("WHERE person_unvl_id = ? \n");
064 insertChildOrgTemplates[1] = sqlText.toString();
065
066 }
067
068 /**
069 * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#buildSubTree(java.lang.String, java.lang.String, java.lang.String, int)
070 */
071 public void buildSubTree(String principalName, String chartOfAccountsCode, String organizationCode, int currentLevel) {
072
073 initPointOfView(principalName, chartOfAccountsCode, organizationCode, currentLevel);
074 insertChildOrgs(principalName, currentLevel);
075 persistenceService.clearCache();
076
077 }
078
079 /**
080 * This method initializes and inserts the root organization using raw SQL.
081 *
082 * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#initPointOfView(java.lang.String, java.lang.String, java.lang.String, int)
083 */
084 protected void initPointOfView(String principalName, String chartOfAccountsCode, String organizationCode, int currentLevel) {
085
086 LOG.debug("initPointOfView() called");
087
088 getSimpleJdbcTemplate().update(initPointOfViewTemplates[0], principalName, currentLevel, chartOfAccountsCode, organizationCode);
089 }
090
091 /**
092 * This method is implemented using RawSql
093 *
094 * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#insertChildOrgs(java.lang.String, int)
095 */
096 protected void insertChildOrgs(String principalName, int previousLevel) {
097
098 LOG.debug("insertChildOrgs() called");
099
100 if (previousLevel <= MAXLEVEL) {
101 int currentLevel = previousLevel + 1;
102
103 // insert the children of the organizations at the current level for the user
104 // and then recursively call on the new level
105 int rowsAffected = getSimpleJdbcTemplate().update(insertChildOrgTemplates[0], principalName, currentLevel, principalName, previousLevel);
106 if (rowsAffected > 0) {
107 insertChildOrgs(principalName, currentLevel);
108 } else {
109 // cleanup by resetting the pull_flag to zero for all
110 getSimpleJdbcTemplate().update(insertChildOrgTemplates[1], principalName);
111 }
112 } else {
113 // overrun problem
114 LOG.warn(String.format("\nWarning: One or more selected organizations have reporting organizations more than maxlevel of %d deep.", MAXLEVEL));
115 }
116 }
117
118 /**
119 * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetPullupDao#cleanGeneralLedgerObjectSummaryTable(java.lang.String)
120 */
121 public void cleanGeneralLedgerObjectSummaryTable(String principalName) {
122 this.clearTempTableByUnvlId("LD_BCN_PULLUP_T","PERSON_UNVL_ID",principalName);
123 /**
124 * this is necessary to clear any rows for the tables we have just updated from the OJB cache. otherwise, subsequent calls to OJB will fetch the old, unupdated cached rows.
125 */
126 persistenceService.clearCache();
127 }
128
129 /**
130 * Sets the persistenceService attribute value.
131 * @param persistenceService The persistenceService to set.
132 */
133 public void setPersistenceService(PersistenceService persistenceService) {
134 this.persistenceService = persistenceService;
135 }
136
137 }
138