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.purap.document.web.struts; 017 018 import java.io.ByteArrayOutputStream; 019 import java.util.HashMap; 020 import java.util.Map; 021 022 import javax.servlet.ServletOutputStream; 023 import javax.servlet.http.HttpServletRequest; 024 import javax.servlet.http.HttpServletResponse; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.apache.log4j.Logger; 028 import org.apache.struts.action.ActionForm; 029 import org.apache.struts.action.ActionForward; 030 import org.apache.struts.action.ActionMapping; 031 import org.kuali.kfs.module.purap.PurapConstants; 032 import org.kuali.kfs.module.purap.PurapPropertyConstants; 033 import org.kuali.kfs.module.purap.document.BulkReceivingDocument; 034 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument; 035 import org.kuali.kfs.module.purap.document.service.BulkReceivingService; 036 import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; 037 import org.kuali.kfs.sys.KFSConstants; 038 import org.kuali.kfs.sys.KFSPropertyConstants; 039 import org.kuali.kfs.sys.context.SpringContext; 040 import org.kuali.kfs.vnd.VendorConstants; 041 import org.kuali.kfs.vnd.businessobject.VendorAddress; 042 import org.kuali.kfs.vnd.document.service.VendorService; 043 import org.kuali.kfs.vnd.service.PhoneNumberService; 044 import org.kuali.rice.kew.exception.WorkflowException; 045 import org.kuali.rice.kew.util.KEWConstants; 046 import org.kuali.rice.kim.util.KimConstants; 047 import org.kuali.rice.kns.document.Document; 048 import org.kuali.rice.kns.document.authorization.DocumentAuthorizer; 049 import org.kuali.rice.kns.question.ConfirmationQuestion; 050 import org.kuali.rice.kns.service.BusinessObjectService; 051 import org.kuali.rice.kns.service.DataDictionaryService; 052 import org.kuali.rice.kns.service.DocumentHelperService; 053 import org.kuali.rice.kns.util.GlobalVariables; 054 import org.kuali.rice.kns.util.KNSConstants; 055 import org.kuali.rice.kns.util.ObjectUtils; 056 import org.kuali.rice.kns.util.WebUtils; 057 import org.kuali.rice.kns.web.struts.action.KualiTransactionalDocumentActionBase; 058 import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; 059 060 public class BulkReceivingAction extends KualiTransactionalDocumentActionBase { 061 protected static final Logger LOG = Logger.getLogger(BulkReceivingAction.class); 062 063 protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException { 064 super.createDocument(kualiDocumentFormBase); 065 BulkReceivingForm blkForm = (BulkReceivingForm) kualiDocumentFormBase; 066 BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkForm.getDocument(); 067 068 blkRecDoc.setPurchaseOrderIdentifier(blkForm.getPurchaseOrderId()); 069 070 blkRecDoc.initiateDocument(); 071 } 072 073 public ActionForward continueBulkReceiving(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 074 BulkReceivingForm blkForm = (BulkReceivingForm) form; 075 BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkForm.getDocument(); 076 077 PurchaseOrderDocument po = SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(blkRecDoc.getPurchaseOrderIdentifier()); 078 if (ObjectUtils.isNotNull(po)) { 079 // TODO figure out a more straightforward way to do this. ailish put this in so the link id would be set and the perm 080 // check would work 081 blkRecDoc.setAccountsPayablePurchasingDocumentLinkIdentifier(po.getAccountsPayablePurchasingDocumentLinkIdentifier()); 082 083 // TODO hjs-check to see if user is allowed to initiate doc based on PO sensitive data (add this to all other docs 084 // except acm doc) 085 if (!SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(blkRecDoc).isAuthorizedByTemplate(blkRecDoc, KNSConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.OPEN_DOCUMENT, GlobalVariables.getUserSession().getPrincipalId())) { 086 throw buildAuthorizationException("initiate document", blkRecDoc); 087 } 088 } 089 090 // perform duplicate check 091 ActionForward forward = isDuplicateDocumentEntry(mapping, form, request, response, blkRecDoc); 092 if (forward != null) { 093 return forward; 094 } 095 096 // populate and save bulk Receiving Document from Purchase Order 097 SpringContext.getBean(BulkReceivingService.class).populateAndSaveBulkReceivingDocument(blkRecDoc); 098 099 return mapping.findForward(KFSConstants.MAPPING_BASIC); 100 } 101 102 public ActionForward clearInitFields(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 103 BulkReceivingForm blkRecForm = (BulkReceivingForm) form; 104 BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkRecForm.getDocument(); 105 106 blkRecDoc.clearInitFields(); 107 108 return mapping.findForward(KFSConstants.MAPPING_BASIC); 109 } 110 111 protected ActionForward isDuplicateDocumentEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, BulkReceivingDocument bulkReceivingDocument) throws Exception { 112 ActionForward forward = null; 113 HashMap<String, String> duplicateMessages = SpringContext.getBean(BulkReceivingService.class).bulkReceivingDuplicateMessages(bulkReceivingDocument); 114 115 if (duplicateMessages != null && !duplicateMessages.isEmpty()) { 116 Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME); 117 if (question == null) { 118 119 return this.performQuestionWithoutInput(mapping, form, request, response, PurapConstants.BulkReceivingDocumentStrings.DUPLICATE_BULK_RECEIVING_DOCUMENT_QUESTION, duplicateMessages.get(PurapConstants.BulkReceivingDocumentStrings.DUPLICATE_BULK_RECEIVING_DOCUMENT_QUESTION), KFSConstants.CONFIRMATION_QUESTION, KFSConstants.ROUTE_METHOD, ""); 120 } 121 122 Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON); 123 if ((PurapConstants.BulkReceivingDocumentStrings.DUPLICATE_BULK_RECEIVING_DOCUMENT_QUESTION.equals(question)) && ConfirmationQuestion.NO.equals(buttonClicked)) { 124 forward = mapping.findForward(KFSConstants.MAPPING_BASIC); 125 } 126 } 127 128 return forward; 129 } 130 131 public ActionForward printReceivingTicket(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 132 String blkDocId = request.getParameter("docId"); 133 ByteArrayOutputStream baosPDF = new ByteArrayOutputStream(); 134 135 try { 136 // will throw validation exception if errors occur 137 SpringContext.getBean(BulkReceivingService.class).performPrintReceivingTicketPDF(blkDocId, baosPDF); 138 139 response.setHeader("Cache-Control", "max-age=30"); 140 response.setContentType("application/pdf"); 141 StringBuffer sbContentDispValue = new StringBuffer(); 142 String useJavascript = request.getParameter("useJavascript"); 143 if (useJavascript == null || useJavascript.equalsIgnoreCase("false")) { 144 sbContentDispValue.append("attachment"); 145 } 146 else { 147 sbContentDispValue.append("inline"); 148 } 149 StringBuffer sbFilename = new StringBuffer(); 150 sbFilename.append("PURAP_RECEIVING_TICKET_"); 151 sbFilename.append(blkDocId); 152 sbFilename.append("_"); 153 sbFilename.append(System.currentTimeMillis()); 154 sbFilename.append(".pdf"); 155 sbContentDispValue.append("; filename="); 156 sbContentDispValue.append(sbFilename); 157 158 response.setHeader("Content-disposition", sbContentDispValue.toString()); 159 160 response.setContentLength(baosPDF.size()); 161 162 ServletOutputStream sos = response.getOutputStream(); 163 baosPDF.writeTo(sos); 164 sos.flush(); 165 166 } 167 finally { 168 if (baosPDF != null) { 169 baosPDF.reset(); 170 } 171 } 172 173 return null; 174 } 175 176 public ActionForward printReceivingTicketPDF(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 177 BulkReceivingForm blkRecForm = (BulkReceivingForm) form; 178 BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkRecForm.getDocument(); 179 180 String basePath = getBasePath(request); 181 String docId = blkRecDoc.getDocumentNumber(); 182 String methodToCallPrintPurchaseOrderPDF = "printReceivingTicket"; 183 String methodToCallDocHandler = "docHandler"; 184 String printReceivingTicketPDFUrl = getUrlForPrintReceivingTicket(basePath, docId, methodToCallPrintPurchaseOrderPDF); 185 String displayReceivingDocTabbedPageUrl = getUrlForPrintReceivingTicket(basePath, docId, methodToCallDocHandler); 186 request.setAttribute("printReceivingTicketPDFUrl", printReceivingTicketPDFUrl); 187 request.setAttribute("displayReceivingDocTabbedPageUrl", displayReceivingDocTabbedPageUrl); 188 String label = SpringContext.getBean(DataDictionaryService.class).getDocumentLabelByTypeName(KFSConstants.FinancialDocumentTypeCodes.BULK_RECEIVING); 189 request.setAttribute("receivingDocLabel", label); 190 191 return mapping.findForward("printReceivingTicketPDF"); 192 } 193 194 protected String getUrlForPrintReceivingTicket(String basePath, String docId, String methodToCall) { 195 196 StringBuffer result = new StringBuffer(basePath); 197 result.append("/purapBulkReceiving.do?methodToCall="); 198 result.append(methodToCall); 199 result.append("&docId="); 200 result.append(docId); 201 result.append("&command=displayDocSearchView"); 202 203 return result.toString(); 204 } 205 206 @Override 207 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 208 BulkReceivingForm blkRecForm = (BulkReceivingForm) form; 209 210 BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkRecForm.getDocument(); 211 String refreshCaller = blkRecForm.getRefreshCaller(); 212 PhoneNumberService phoneNumberService = SpringContext.getBean(PhoneNumberService.class); 213 214 // Format phone numbers 215 blkRecDoc.setInstitutionContactPhoneNumber(phoneNumberService.formatNumberIfPossible(blkRecDoc.getInstitutionContactPhoneNumber())); 216 blkRecDoc.setRequestorPersonPhoneNumber(phoneNumberService.formatNumberIfPossible(blkRecDoc.getRequestorPersonPhoneNumber())); 217 blkRecDoc.setDeliveryToPhoneNumber(phoneNumberService.formatNumberIfPossible(blkRecDoc.getDeliveryToPhoneNumber())); 218 219 // Refreshing the fields after returning from a vendor lookup in the vendor tab 220 if (StringUtils.equals(refreshCaller, VendorConstants.VENDOR_LOOKUPABLE_IMPL) && blkRecDoc.getVendorDetailAssignedIdentifier() != null && blkRecDoc.getVendorHeaderGeneratedIdentifier() != null) { 221 222 // retrieve vendor based on selection from vendor lookup 223 blkRecDoc.refreshReferenceObject("vendorDetail"); 224 blkRecDoc.setVendorName(blkRecDoc.getVendorDetail().getVendorName()); 225 226 // populate default address based on selected vendor 227 VendorAddress defaultAddress = SpringContext.getBean(VendorService.class).getVendorDefaultAddress(blkRecDoc.getVendorDetail().getVendorAddresses(), blkRecDoc.getVendorDetail().getVendorHeader().getVendorType().getAddressType().getVendorAddressTypeCode(), ""); 228 if (ObjectUtils.isNotNull(defaultAddress)) { 229 blkRecDoc.setVendorLine1Address(defaultAddress.getVendorLine1Address()); 230 blkRecDoc.setVendorLine2Address(defaultAddress.getVendorLine2Address()); 231 blkRecDoc.setVendorCityName(defaultAddress.getVendorCityName()); 232 blkRecDoc.setVendorStateCode(defaultAddress.getVendorStateCode()); 233 blkRecDoc.setVendorPostalCode(defaultAddress.getVendorZipCode()); 234 blkRecDoc.setVendorCountryCode(defaultAddress.getVendorCountryCode()); 235 } 236 } 237 238 // Refreshing the fields after returning from an address lookup in the vendor tab 239 if (StringUtils.equals(refreshCaller, VendorConstants.VENDOR_ADDRESS_LOOKUPABLE_IMPL)) { 240 if (StringUtils.isNotEmpty(request.getParameter(KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.VENDOR_ADDRESS_ID))) { 241 // retrieve address based on selection from address lookup 242 VendorAddress refreshVendorAddress = new VendorAddress(); 243 refreshVendorAddress.setVendorAddressGeneratedIdentifier(blkRecDoc.getVendorAddressGeneratedIdentifier()); 244 refreshVendorAddress = (VendorAddress) SpringContext.getBean(BusinessObjectService.class).retrieve(refreshVendorAddress); 245 if (ObjectUtils.isNotNull(refreshVendorAddress)) { 246 blkRecDoc.setVendorLine1Address(refreshVendorAddress.getVendorLine1Address()); 247 blkRecDoc.setVendorLine2Address(refreshVendorAddress.getVendorLine2Address()); 248 blkRecDoc.setVendorCityName(refreshVendorAddress.getVendorCityName()); 249 blkRecDoc.setVendorStateCode(refreshVendorAddress.getVendorStateCode()); 250 blkRecDoc.setVendorPostalCode(refreshVendorAddress.getVendorZipCode()); 251 blkRecDoc.setVendorCountryCode(refreshVendorAddress.getVendorCountryCode()); 252 } 253 } 254 } 255 256 // Refreshing corresponding fields after returning from various kuali lookups 257 if (StringUtils.equals(refreshCaller, KFSConstants.KUALI_LOOKUPABLE_IMPL)) { 258 if (request.getParameter("document.deliveryCampusCode") != null) { 259 // returning from a building or campus lookup on the delivery tab 260 261 if (request.getParameter("document.deliveryBuildingName") == null) { 262 // came from campus lookup not building, so clear building 263 blkRecDoc.setDeliveryBuildingCode(""); 264 blkRecDoc.setDeliveryBuildingLine1Address(""); 265 blkRecDoc.setDeliveryBuildingLine2Address(""); 266 blkRecDoc.setDeliveryBuildingRoomNumber(""); 267 blkRecDoc.setDeliveryCityName(""); 268 blkRecDoc.setDeliveryStateCode(""); 269 blkRecDoc.setDeliveryPostalCode(""); 270 blkRecDoc.setDeliveryCountryCode(""); 271 } 272 else { 273 // came from building lookup then turn off "OTHER" and clear room and line2address 274 blkRecDoc.setDeliveryBuildingOtherIndicator(false); 275 blkRecDoc.setDeliveryBuildingRoomNumber(""); 276 blkRecDoc.setDeliveryBuildingLine2Address(""); 277 } 278 } 279 } 280 281 return super.refresh(mapping, form, request, response); 282 } 283 284 /** 285 * Setup document to use "OTHER" building 286 * 287 * @param mapping An ActionMapping 288 * @param form An ActionForm 289 * @param request A HttpServletRequest 290 * @param response A HttpServletResponse 291 * @return An ActionForward 292 * @throws Exception 293 */ 294 public ActionForward useOtherDeliveryBuilding(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 295 BulkReceivingForm baseForm = (BulkReceivingForm) form; 296 BulkReceivingDocument document = (BulkReceivingDocument) baseForm.getDocument(); 297 298 document.setDeliveryBuildingOtherIndicator(true); 299 document.setDeliveryBuildingName(""); 300 document.setDeliveryBuildingCode(""); 301 document.setDeliveryBuildingLine1Address(""); 302 document.setDeliveryBuildingLine2Address(""); 303 document.setDeliveryBuildingRoomNumber(""); 304 document.setDeliveryCityName(""); 305 document.setDeliveryStateCode(""); 306 document.setDeliveryCountryCode(""); 307 document.setDeliveryPostalCode(""); 308 309 return mapping.findForward(KFSConstants.MAPPING_BASIC); 310 } 311 312 @Override 313 protected void populateAdHocActionRequestCodes(KualiDocumentFormBase formBase){ 314 Document document = formBase.getDocument(); 315 DocumentAuthorizer documentAuthorizer = getDocumentHelperService().getDocumentAuthorizer(document); 316 Map<String,String> adHocActionRequestCodes = new HashMap<String,String>(); 317 318 if (documentAuthorizer.canSendAdHocRequests(document, KEWConstants.ACTION_REQUEST_FYI_REQ, GlobalVariables.getUserSession().getPerson())) { 319 adHocActionRequestCodes.put(KEWConstants.ACTION_REQUEST_FYI_REQ, KEWConstants.ACTION_REQUEST_FYI_REQ_LABEL); 320 } 321 if ( (document.getDocumentHeader().getWorkflowDocument().stateIsInitiated() 322 || document.getDocumentHeader().getWorkflowDocument().stateIsSaved() 323 || document.getDocumentHeader().getWorkflowDocument().stateIsEnroute() 324 )&& documentAuthorizer.canSendAdHocRequests(document, KEWConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ, GlobalVariables.getUserSession().getPerson())) { 325 adHocActionRequestCodes.put(KEWConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ, KEWConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ_LABEL); 326 } 327 formBase.setAdHocActionRequestCodes(adHocActionRequestCodes); 328 329 } 330 331 }