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.sys.document;
017
018 import org.apache.log4j.Logger;
019 import org.kuali.kfs.sys.KFSConstants;
020 import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader;
021 import org.kuali.kfs.sys.context.SpringContext;
022 import org.kuali.kfs.sys.document.dataaccess.FinancialSystemDocumentHeaderDao;
023 import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO;
024 import org.kuali.rice.kew.exception.WorkflowException;
025 import org.kuali.rice.kew.exception.WorkflowRuntimeException;
026 import org.kuali.rice.kim.bo.Person;
027 import org.kuali.rice.kim.service.PersonService;
028 import org.kuali.rice.kns.bo.DocumentHeader;
029 import org.kuali.rice.kns.document.MaintenanceDocumentBase;
030 import org.kuali.rice.kns.service.DateTimeService;
031
032 /**
033 * This class is used by the system to use financial specific objects and data for maintenance documents
034 */
035 public class FinancialSystemMaintenanceDocument extends MaintenanceDocumentBase {
036 protected static final Logger LOG = Logger.getLogger(FinancialSystemMaintenanceDocument.class);
037
038 protected FinancialSystemDocumentHeader documentHeader;
039
040 /**
041 * Constructs a FinancialSystemMaintenanceDocument.java.
042 */
043 public FinancialSystemMaintenanceDocument() {
044 super();
045 }
046
047 /**
048 * Constructs a FinancialSystemMaintenanceDocument.java.
049 * @param documentTypeName
050 */
051 public FinancialSystemMaintenanceDocument(String documentTypeName) {
052 super(documentTypeName);
053 }
054
055 /**
056 * @see org.kuali.rice.kns.document.DocumentBase#getDocumentHeader()
057 */
058 @Override
059 public FinancialSystemDocumentHeader getDocumentHeader() {
060 return documentHeader;
061 }
062
063 /**
064 * @see org.kuali.rice.kns.document.DocumentBase#setDocumentHeader(org.kuali.rice.kns.bo.DocumentHeader)
065 */
066 @Override
067 public void setDocumentHeader(DocumentHeader documentHeader) {
068 if ((documentHeader != null) && (!FinancialSystemDocumentHeader.class.isAssignableFrom(documentHeader.getClass()))) {
069 throw new IllegalArgumentException("document header of class '" + documentHeader.getClass() + "' is not assignable from financial document header class '" + FinancialSystemDocumentHeader.class + "'");
070 }
071 this.documentHeader = (FinancialSystemDocumentHeader) documentHeader;
072 }
073
074 /**
075 * If the document has a total amount, call method on document to get the total and set in doc header.
076 *
077 * @see org.kuali.rice.kns.document.Document#prepareForSave()
078 */
079 // @Override
080 // public void prepareForSave() {
081 // if (this instanceof AmountTotaling) {
082 // getDocumentHeader().setFinancialDocumentTotalAmount(((AmountTotaling) this).getTotalDollarAmount());
083 // }
084 // }
085
086 /**
087 * This is the default implementation which ensures that document note attachment references are loaded.
088 *
089 * @see org.kuali.rice.kns.document.Document#processAfterRetrieve()
090 */
091 @Override
092 public void processAfterRetrieve() {
093 // set correctedByDocumentId manually, since OJB doesn't maintain that relationship
094 try {
095 DocumentHeader correctingDocumentHeader = SpringContext.getBean(FinancialSystemDocumentHeaderDao.class).getCorrectingDocumentHeader(getDocumentHeader().getWorkflowDocument().getRouteHeaderId().toString());
096 if (correctingDocumentHeader != null) {
097 getDocumentHeader().setCorrectedByDocumentId(correctingDocumentHeader.getDocumentNumber());
098 }
099 } catch (WorkflowException e) {
100 LOG.error("Received WorkflowException trying to get route header id from workflow document");
101 throw new WorkflowRuntimeException(e);
102 }
103 // set the ad hoc route recipients too, since OJB doesn't maintain that relationship
104 // TODO - see KULNRVSYS-1054
105
106 super.processAfterRetrieve();
107 }
108
109 /**
110 * This is the default implementation which checks for a different workflow statuses, and updates the Kuali status accordingly.
111 *
112 * @see org.kuali.rice.kns.document.Document#doRouteStatusChange()
113 */
114 @Override
115 public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) {
116 if (getDocumentHeader().getWorkflowDocument().stateIsCanceled()) {
117 getDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.CANCELLED);
118 }
119 else if (getDocumentHeader().getWorkflowDocument().stateIsEnroute()) {
120 getDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.ENROUTE);
121 }
122 if (getDocumentHeader().getWorkflowDocument().stateIsDisapproved()) {
123 getDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.DISAPPROVED);
124 }
125 if (getDocumentHeader().getWorkflowDocument().stateIsProcessed()) {
126 getDocumentHeader().setFinancialDocumentStatusCode(KFSConstants.DocumentStatusCodes.APPROVED);
127 }
128 LOG.info("Status is: " + getDocumentHeader().getFinancialDocumentStatusCode());
129
130 super.doRouteStatusChange(statusChangeEvent);
131 }
132
133 public boolean answerSplitNodeQuestion(String nodeName) {
134 if (getNewMaintainableObject() instanceof FinancialSystemMaintainable) {
135 FinancialSystemMaintainable fsMaintainable = (FinancialSystemMaintainable)getNewMaintainableObject();
136
137 if (fsMaintainable == null) {
138 throw new UnsupportedOperationException("Cannot access Maintainable class to answer split node question");
139 }
140 return fsMaintainable.answerSplitNodeQuestion(nodeName);
141 } else if (getNewMaintainableObject() instanceof FinancialSystemGlobalMaintainable) {
142 FinancialSystemGlobalMaintainable fsMaintainable = (FinancialSystemGlobalMaintainable)getNewMaintainableObject();
143
144 if (fsMaintainable == null) {
145 throw new UnsupportedOperationException("Cannot access Maintainable class to answer split node question");
146 }
147 return fsMaintainable.answerSplitNodeQuestion(nodeName);
148 } else {
149 throw new UnsupportedOperationException("Maintainable for "+getNewMaintainableObject().getBoClass().getName()+" does not extend org.kuali.kfs.sys.document.FinancialSystemMaintainable nor org.kuali.kfs.sys.document.FinancialSystemGlobalMaintainable and therefore cannot answer split node question");
150 }
151 }
152
153 /**
154 * This method is used for routing and simply returns the initiator's Chart code.
155 * @return The Chart code of the document initiator
156 */
157 public String getInitiatorChartOfAccountsCode() {
158 String[] chartOrg = getInitiatorPrimaryDepartmentCode();
159 return chartOrg[0];
160 }
161
162 /**
163 * This method is used for routing and simply returns the initiator's Organization code.
164 * @return The Organization code of the document initiator
165 */
166 public String getInitiatorOrganizationCode() {
167 String[] chartOrg = getInitiatorPrimaryDepartmentCode();
168 return chartOrg[1];
169 }
170
171 /**
172 *
173 * This method is a utility method that returns a String array containing the document initiator's
174 * ChartCode in the first index and the OrganizationCode in the second.
175 * @return a String array.
176 */
177 protected String[] getInitiatorPrimaryDepartmentCode() {
178 PersonService personService = SpringContext.getBean(PersonService.class);
179
180 String netID = documentHeader.getWorkflowDocument().getInitiatorNetworkId();
181 Person person = personService.getPersonByPrincipalName(netID);
182
183 String deptCode = person.getPrimaryDepartmentCode();
184 String[] chartOrg = deptCode.split("-");
185 return chartOrg;
186
187 }
188
189 }
190