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.endow.document; 017 018 import java.util.HashMap; 019 import java.util.Map; 020 import java.sql.Date; 021 022 import org.apache.cxf.common.util.StringUtils; 023 import org.kuali.kfs.module.endow.EndowConstants; 024 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionSourceType; 025 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionSubType; 026 import org.kuali.kfs.module.endow.businessobject.PendingTransactionDocumentEntry; 027 import org.kuali.kfs.module.endow.document.service.KEMService; 028 import org.kuali.kfs.sys.context.SpringContext; 029 import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase; 030 import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO; 031 import org.kuali.rice.kew.exception.WorkflowException; 032 import org.kuali.rice.kns.service.BusinessObjectService; 033 import org.kuali.rice.kns.service.DateTimeService; 034 import org.kuali.rice.kns.util.KNSPropertyConstants; 035 import org.kuali.rice.kns.util.ObjectUtils; 036 037 038 public abstract class EndowmentTransactionalDocumentBase extends FinancialSystemTransactionalDocumentBase implements EndowmentTransactionalDocument { 039 protected static final String CHECK_IF_ROUTE_SPLIT = "CheckIfNoRoute"; 040 protected String transactionSubTypeCode; 041 protected String transactionSourceTypeCode; 042 protected boolean transactionPosted; 043 044 protected EndowmentTransactionSubType transactionSubType; 045 protected EndowmentTransactionSourceType transactionSourceType; 046 047 protected static transient BusinessObjectService businessObjectService; 048 protected static transient DateTimeService dateTimeService; 049 050 protected boolean noRouteIndicator; 051 052 /** 053 * Constructs a EndowmentTransactionalDocumentBase.java. 054 */ 055 public EndowmentTransactionalDocumentBase() { 056 super(); 057 this.transactionPosted = false; 058 059 //set noRouteIndicator = false by default to make sure when a user initiates 060 //the eDoc manually through UI, it goes through the routing path defined in 061 //the workflow xml file. 062 this.noRouteIndicator= false; 063 this.setTransactionSourceTypeCode(EndowConstants.TransactionSourceTypeCode.MANUAL); 064 initializeSourceTypeObj(); 065 } 066 067 /** 068 * Constructs used by creating a recurring or automated eDoc 069 */ 070 public EndowmentTransactionalDocumentBase(String transactionSourceTypeCode) { 071 super(); 072 this.transactionPosted = false; 073 this.setTransactionSourceTypeCode(transactionSourceTypeCode); 074 initializeSourceTypeObj(); 075 } 076 077 /** 078 * This method fills source type code for UI on Initial request. 079 */ 080 protected void initializeSourceTypeObj() { 081 EndowmentTransactionSourceType endowmentTransactionSourceType = getBusinessObjectService().findBySinglePrimaryKey(EndowmentTransactionSourceType.class, this.getTransactionSourceTypeCode()); 082 this.setTransactionSourceType(endowmentTransactionSourceType); 083 } 084 085 /** 086 * This method fills sub type code for UI on Initial request. 087 */ 088 protected void initializeSubType() { 089 EndowmentTransactionSubType endowmentTransactionSubType = getBusinessObjectService().findBySinglePrimaryKey(EndowmentTransactionSubType.class, this.getTransactionSubTypeCode()); 090 setTransactionSubType(endowmentTransactionSubType); 091 } 092 093 /** 094 * @see org.kuali.kfs.module.endow.document.EndowmentTransactionalDocument#getTransactionSubTypeCode() 095 */ 096 public String getTransactionSubTypeCode() { 097 return transactionSubTypeCode; 098 } 099 100 /** 101 * @see org.kuali.kfs.module.endow.document.EndowmentTransactionalDocument#setTransactionSubTypeCode(java.lang.String) 102 */ 103 public void setTransactionSubTypeCode(String transactionSubTypeCode) { 104 this.transactionSubTypeCode = transactionSubTypeCode; 105 } 106 107 /** 108 * @see org.kuali.kfs.module.endow.document.EndowmentTransactionalDocument#getTransactionSourceTypeCode() 109 */ 110 public String getTransactionSourceTypeCode() { 111 return transactionSourceTypeCode; 112 } 113 114 /** 115 * @see org.kuali.kfs.module.endow.document.EndowmentTransactionalDocument#setTransactionSourceTypeCode(java.lang.String) 116 */ 117 public void setTransactionSourceTypeCode(String transactionSourceTypeCode) { 118 this.transactionSourceTypeCode = transactionSourceTypeCode; 119 } 120 121 /** 122 * @see org.kuali.kfs.module.endow.document.EndowmentTransactionalDocument#isTransactionPosted() 123 */ 124 public boolean isTransactionPosted() { 125 return transactionPosted; 126 } 127 128 /** 129 * @see org.kuali.kfs.module.endow.document.EndowmentTransactionalDocument#setTransactionPosted(boolean) 130 */ 131 public void setTransactionPosted(boolean transactionPosted) { 132 this.transactionPosted = transactionPosted; 133 } 134 135 /** 136 * Gets the transactionSubType. 137 * 138 * @return transactionSubType 139 */ 140 public EndowmentTransactionSubType getTransactionSubType() { 141 return transactionSubType; 142 } 143 144 /** 145 * Sets the transactionSubType. 146 * 147 * @param transactionSubType 148 */ 149 public void setTransactionSubType(EndowmentTransactionSubType transactionSubType) { 150 this.transactionSubType = transactionSubType; 151 } 152 153 /** 154 * Gets the transactionSourceType. 155 * 156 * @return transactionSourceType 157 */ 158 public EndowmentTransactionSourceType getTransactionSourceType() { 159 return transactionSourceType; 160 } 161 162 /** 163 * Sets the transactionSourceType. 164 * 165 * @param transactionSourceType 166 */ 167 public void setTransactionSourceType(EndowmentTransactionSourceType transactionSourceType) { 168 this.transactionSourceType = transactionSourceType; 169 } 170 171 /** 172 * Gets the noRouteIndicator. 173 * 174 * @return noRouteIndicator 175 */ 176 public boolean getNoRouteIndicator(){ 177 return noRouteIndicator; 178 } 179 180 /** 181 * Sets the noRouteIndicator. 182 * 183 * @param noRouteIndicator 184 */ 185 public void setNoRouteIndicator(boolean noRouteIndicator){ 186 this.noRouteIndicator = noRouteIndicator; 187 } 188 189 /** 190 * @see org.kuali.kfs.sys.document.Correctable#toErrorCorrection() 191 */ 192 public void toErrorCorrection() throws WorkflowException, IllegalStateException { 193 super.toErrorCorrection(); 194 195 // Reset All the Version numbers to 1 196 try { 197 ObjectUtils.setObjectPropertyDeep(this, KNSPropertyConstants.VERSION_NUMBER, versionNumber.getClass(), 0L); 198 } 199 catch (Exception e) { 200 LOG.error("Unable to set version number property in copied document " + e.getMessage()); 201 throw new RuntimeException("Unable to set version number property in copied document " + e.getMessage()); 202 } 203 } 204 205 /** 206 * @see org.kuali.kfs.module.endow.document.EndowmentTransactionalDocument#isErrorCorrectedDocument() 207 */ 208 public boolean isErrorCorrectedDocument() { 209 if (StringUtils.isEmpty(getDocumentHeader().getFinancialDocumentInErrorNumber())) 210 return false; 211 else 212 return true; 213 } 214 215 /** 216 * When document is processed or in the final status, create an PendingTransactionDocumentEntry object 217 * and persist documentId, documentType and the approved date to END_PENDING_TRAN_DOC_T. 218 * 219 * @see org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase#doRouteStatusChange() 220 */ 221 @Override 222 public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent){ 223 super.doRouteStatusChange(statusChangeEvent); 224 225 if (getDocumentHeader().getWorkflowDocument().stateIsProcessed()) { 226 227 String documentId = getDocumentHeader().getDocumentNumber(); 228 String documentType = getDocumentHeader().getWorkflowDocument().getDocumentType(); 229 Date approvedDate = getDateTimeService().getCurrentSqlDate(); 230 231 //persist documentId, documentType and the approved date to END_PENDING_TRAN_DOC_T 232 PendingTransactionDocumentEntry entry = new PendingTransactionDocumentEntry(); 233 entry.setDocumentNumber(documentId); 234 entry.setDocumentType(documentType); 235 entry.setApprovedDate(approvedDate); 236 237 getBusinessObjectService().save(entry); 238 } 239 } 240 241 public boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException { 242 if (nodeName.equals(this.CHECK_IF_ROUTE_SPLIT)) 243 return this.noRouteIndicator; 244 throw new UnsupportedOperationException("Cannot answer split question for this node you call \""+nodeName+"\""); 245 } 246 247 protected BusinessObjectService getBusinessObjectService() { 248 if ( businessObjectService == null ) { 249 businessObjectService = SpringContext.getBean(BusinessObjectService.class); 250 } 251 return businessObjectService; 252 } 253 254 public DateTimeService getDateTimeService() { 255 if ( dateTimeService == null ) { 256 dateTimeService = SpringContext.getBean(DateTimeService.class); 257 } 258 return dateTimeService; 259 } 260 261 262 }