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 017 package org.kuali.kfs.module.purap.document; 018 019 import java.util.ArrayList; 020 import java.util.HashMap; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.kuali.kfs.module.purap.PurapConstants; 025 import org.kuali.kfs.module.purap.PurapParameterConstants; 026 import org.kuali.kfs.module.purap.PurapPropertyConstants; 027 import org.kuali.kfs.module.purap.PurapWorkflowConstants; 028 import org.kuali.kfs.module.purap.businessobject.ContractManagerAssignmentDetail; 029 import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; 030 import org.kuali.kfs.module.purap.document.service.RequisitionService; 031 import org.kuali.kfs.sys.DynamicCollectionComparator; 032 import org.kuali.kfs.sys.context.SpringContext; 033 import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase; 034 import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO; 035 import org.kuali.rice.kew.dto.NetworkIdDTO; 036 import org.kuali.rice.kew.exception.WorkflowException; 037 import org.kuali.rice.kew.util.KEWConstants; 038 import org.kuali.rice.kns.service.BusinessObjectService; 039 import org.kuali.rice.kns.service.DocumentService; 040 import org.kuali.rice.kns.service.ParameterService; 041 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument; 042 043 public class ContractManagerAssignmentDocument extends FinancialSystemTransactionalDocumentBase { 044 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ContractManagerAssignmentDocument.class); 045 046 protected List<ContractManagerAssignmentDetail> contractManagerAssignmentDetails = new ArrayList<ContractManagerAssignmentDetail>(); 047 048 // Not persisted (only for labels in tag) 049 protected String requisitionNumber; 050 protected String deliveryCampusCode; 051 protected String vendorName; 052 protected String generalDescription; 053 protected String requisitionTotalAmount; 054 protected String requisitionCreateDate; 055 protected String firstItemDescription; 056 protected String firstItemCommodityCode; 057 protected String firstObjectCode; 058 protected String universityFiscalYear; 059 060 061 /** 062 * Default constructor. 063 */ 064 public ContractManagerAssignmentDocument() { 065 super(); 066 } 067 068 public ContractManagerAssignmentDetail getContractManagerAssignmentDetail(int index) { 069 while (contractManagerAssignmentDetails.size() <= index) { 070 contractManagerAssignmentDetails.add(new ContractManagerAssignmentDetail()); 071 } 072 return (ContractManagerAssignmentDetail) contractManagerAssignmentDetails.get(index); 073 } 074 075 /** 076 * Perform logic needed to populate the Assign Contract Manager Document with requisitions in status of Awaiting Contract 077 * Manager Assignment. 078 */ 079 public void populateDocumentWithRequisitions() { 080 LOG.debug("populateDocumentWithRequisitions() Entering method."); 081 082 List<RequisitionDocument> unassignedRequisitions = new ArrayList(SpringContext.getBean(RequisitionService.class).getRequisitionsAwaitingContractManagerAssignment()); 083 List<String>documentHeaderIds = new ArrayList(); 084 for (RequisitionDocument req : unassignedRequisitions) { 085 documentHeaderIds.add(req.getDocumentNumber()); 086 } 087 088 List<RequisitionDocument> requisitionDocumentsFromDocService = new ArrayList(); 089 try { 090 if ( documentHeaderIds.size() > 0 ) 091 requisitionDocumentsFromDocService = SpringContext.getBean(DocumentService.class).getDocumentsByListOfDocumentHeaderIds(RequisitionDocument.class, documentHeaderIds); 092 } 093 catch (WorkflowException we) { 094 String errorMsg = "Workflow Exception caught: " + we.getLocalizedMessage(); 095 LOG.error(errorMsg, we); 096 throw new RuntimeException(errorMsg, we); 097 } 098 099 for (RequisitionDocument req : requisitionDocumentsFromDocService) { 100 contractManagerAssignmentDetails.add(new ContractManagerAssignmentDetail(this, req)); 101 } 102 103 String[] fieldNames = {PurapPropertyConstants.DELIVERY_CAMPUS_CODE, PurapPropertyConstants.VENDOR_NAME, PurapPropertyConstants.REQUISITION_IDENTIFIER}; 104 DynamicCollectionComparator.sort(contractManagerAssignmentDetails, fieldNames); 105 LOG.debug("populateDocumentWithRequisitions() Leaving method."); 106 } 107 108 @Override 109 public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) { 110 LOG.debug("doRouteStatusChange() Entering method."); 111 112 super.doRouteStatusChange(statusChangeEvent); 113 114 if (this.getDocumentHeader().getWorkflowDocument().stateIsProcessed()) { 115 boolean isSuccess = true; 116 StringBuffer failedReqs = new StringBuffer(); 117 SpringContext.getBean(PurchaseOrderService.class).processACMReq(this); 118 119 if (!isSuccess) { 120 failedReqs.deleteCharAt(failedReqs.lastIndexOf(",")); 121 KualiWorkflowDocument workflowDoc = this.getDocumentHeader().getWorkflowDocument(); 122 String currentNodeName = null; 123 try { 124 currentNodeName = PurapWorkflowConstants.DOC_ADHOC_NODE_NAME; 125 if (!(KEWConstants.ROUTE_HEADER_INITIATED_CD.equals(workflowDoc.getRouteHeader().getDocRouteStatus()))) { 126 if (this.getCurrentRouteNodeName(workflowDoc) != null) { 127 currentNodeName = this.getCurrentRouteNodeName(workflowDoc); 128 } 129 } 130 workflowDoc.adHocRouteDocumentToPrincipal(KEWConstants.ACTION_REQUEST_FYI_REQ, currentNodeName, PurapWorkflowConstants.ContractManagerAssignmentDocument.ASSIGN_CONTRACT_DOC_ERROR_COMPLETING_POST_PROCESSING + failedReqs, workflowDoc.getRouteHeader().getInitiatorPrincipalId(), "Initiator", true); 131 } 132 catch (WorkflowException e) { 133 // do nothing; document should have processed successfully and problem is with sending FYI 134 } 135 } 136 } 137 LOG.debug("doRouteStatusChange() Leaving method."); 138 } 139 140 protected String getCurrentRouteNodeName(KualiWorkflowDocument wd) throws WorkflowException { 141 String[] nodeNames = wd.getNodeNames(); 142 if ((nodeNames == null) || (nodeNames.length == 0)) { 143 return null; 144 } 145 else { 146 return nodeNames[0]; 147 } 148 } 149 150 /** 151 * @see org.kuali.rice.kns.document.Document#getDocumentTitle() 152 */ 153 @Override 154 public String getDocumentTitle() { 155 String title = ""; 156 if (SpringContext.getBean(ParameterService.class).getIndicatorParameter(ContractManagerAssignmentDocument.class, PurapParameterConstants.PURAP_OVERRIDE_ASSIGN_CONTRACT_MGR_DOC_TITLE)) { 157 title = PurapWorkflowConstants.ContractManagerAssignmentDocument.WORKFLOW_DOCUMENT_TITLE; 158 } 159 else { 160 title = super.getDocumentTitle(); 161 } 162 return title; 163 } 164 165 public List getContractManagerAssignmentDetails() { 166 return contractManagerAssignmentDetails; 167 } 168 169 public void setContractManagerAssignmentDetailss(List contractManagerAssignmentDetails) { 170 this.contractManagerAssignmentDetails = contractManagerAssignmentDetails; 171 } 172 173 /** 174 * Gets the firstObjectCode attribute. 175 * 176 * @return Returns the firstObjectCode. 177 */ 178 public String getFirstObjectCode() { 179 return firstObjectCode; 180 } 181 182 /** 183 * Gets the deliveryCampusCode attribute. 184 * 185 * @return Returns the deliveryCampusCode. 186 */ 187 public String getDeliveryCampusCode() { 188 return deliveryCampusCode; 189 } 190 191 /** 192 * Gets the firstItemDescription attribute. 193 * 194 * @return Returns the firstItemDescription. 195 */ 196 public String getFirstItemDescription() { 197 return firstItemDescription; 198 } 199 200 /** 201 * Gets the firstItemCommodityCode attribute. 202 * 203 * @return Returns the firstItemCommodityCode. 204 */ 205 public String getFirstItemCommodityCode() { 206 return firstItemCommodityCode; 207 } 208 209 /** 210 * Gets the generalDescription attribute. 211 * 212 * @return Returns the generalDescription. 213 */ 214 public String getGeneralDescription() { 215 return generalDescription; 216 } 217 218 /** 219 * Gets the requisitionCreateDate attribute. 220 * 221 * @return Returns the requisitionCreateDate. 222 */ 223 public String getRequisitionCreateDate() { 224 return requisitionCreateDate; 225 } 226 227 /** 228 * Gets the requisitionNumber attribute. 229 * 230 * @return Returns the requisitionNumber. 231 */ 232 public String getRequisitionNumber() { 233 return requisitionNumber; 234 } 235 236 /** 237 * Gets the requisitionTotalAmount attribute. 238 * 239 * @return Returns the requisitionTotalAmount. 240 */ 241 public String getRequisitionTotalAmount() { 242 return requisitionTotalAmount; 243 } 244 245 /** 246 * Gets the vendorName attribute. 247 * 248 * @return Returns the vendorName. 249 */ 250 public String getVendorName() { 251 return vendorName; 252 } 253 254 public String getUniversityFiscalYear() { 255 return universityFiscalYear; 256 } 257 258 }