/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.purap.document.web.struts; import java.io.ByteArrayOutputStream; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.kuali.kfs.module.purap.PurapConstants; import org.kuali.kfs.module.purap.PurapPropertyConstants; import org.kuali.kfs.module.purap.document.BulkReceivingDocument; import org.kuali.kfs.module.purap.document.PurchaseOrderDocument; import org.kuali.kfs.module.purap.document.service.BulkReceivingService; import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.vnd.VendorConstants; import org.kuali.kfs.vnd.businessobject.VendorAddress; import org.kuali.kfs.vnd.document.service.VendorService; import org.kuali.kfs.vnd.service.PhoneNumberService; import org.kuali.rice.kew.api.KewApiConstants; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kim.api.KimConstants; import org.kuali.rice.kns.document.authorization.DocumentAuthorizer; import org.kuali.rice.kns.question.ConfirmationQuestion; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.kns.service.DocumentHelperService; import org.kuali.rice.kns.web.struts.action.KualiTransactionalDocumentActionBase; import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.KRADConstants; import org.kuali.rice.krad.util.ObjectUtils; public class BulkReceivingAction extends KualiTransactionalDocumentActionBase { protected static final Logger LOG = Logger.getLogger(BulkReceivingAction.class); protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException { super.createDocument(kualiDocumentFormBase); BulkReceivingForm blkForm = (BulkReceivingForm) kualiDocumentFormBase; BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkForm.getDocument(); blkRecDoc.setPurchaseOrderIdentifier(blkForm.getPurchaseOrderId()); blkRecDoc.initiateDocument(); } public ActionForward continueBulkReceiving(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BulkReceivingForm blkForm = (BulkReceivingForm) form; BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkForm.getDocument(); PurchaseOrderDocument po = SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(blkRecDoc.getPurchaseOrderIdentifier()); if (ObjectUtils.isNotNull(po)) { // TODO figure out a more straightforward way to do this. ailish put this in so the link id would be set and the perm // check would work blkRecDoc.setAccountsPayablePurchasingDocumentLinkIdentifier(po.getAccountsPayablePurchasingDocumentLinkIdentifier()); // TODO hjs-check to see if user is allowed to initiate doc based on PO sensitive data (add this to all other docs // except acm doc) if (!SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(blkRecDoc).isAuthorizedByTemplate(blkRecDoc, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.OPEN_DOCUMENT, GlobalVariables.getUserSession().getPrincipalId())) { throw buildAuthorizationException("initiate document", blkRecDoc); } } // perform duplicate check ActionForward forward = isDuplicateDocumentEntry(mapping, form, request, response, blkRecDoc); if (forward != null) { return forward; } // populate and save bulk Receiving Document from Purchase Order SpringContext.getBean(BulkReceivingService.class).populateAndSaveBulkReceivingDocument(blkRecDoc); return mapping.findForward(KFSConstants.MAPPING_BASIC); } public ActionForward clearInitFields(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BulkReceivingForm blkRecForm = (BulkReceivingForm) form; BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkRecForm.getDocument(); blkRecDoc.clearInitFields(); return mapping.findForward(KFSConstants.MAPPING_BASIC); } protected ActionForward isDuplicateDocumentEntry(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, BulkReceivingDocument bulkReceivingDocument) throws Exception { ActionForward forward = null; HashMap<String, String> duplicateMessages = SpringContext.getBean(BulkReceivingService.class).bulkReceivingDuplicateMessages(bulkReceivingDocument); if (duplicateMessages != null && !duplicateMessages.isEmpty()) { Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME); if (question == null) { 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, ""); } Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON); if ((PurapConstants.BulkReceivingDocumentStrings.DUPLICATE_BULK_RECEIVING_DOCUMENT_QUESTION.equals(question)) && ConfirmationQuestion.NO.equals(buttonClicked)) { forward = mapping.findForward(KFSConstants.MAPPING_BASIC); } } return forward; } public ActionForward printReceivingTicket(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String blkDocId = request.getParameter("docId"); ByteArrayOutputStream baosPDF = new ByteArrayOutputStream(); try { // will throw validation exception if errors occur SpringContext.getBean(BulkReceivingService.class).performPrintReceivingTicketPDF(blkDocId, baosPDF); response.setHeader("Cache-Control", "max-age=30"); response.setContentType("application/pdf"); StringBuffer sbContentDispValue = new StringBuffer(); String useJavascript = request.getParameter("useJavascript"); if (useJavascript == null || useJavascript.equalsIgnoreCase("false")) { sbContentDispValue.append("attachment"); } else { sbContentDispValue.append("inline"); } StringBuffer sbFilename = new StringBuffer(); sbFilename.append("PURAP_RECEIVING_TICKET_"); sbFilename.append(blkDocId); sbFilename.append("_"); sbFilename.append(System.currentTimeMillis()); sbFilename.append(".pdf"); sbContentDispValue.append("; filename="); sbContentDispValue.append(sbFilename); response.setHeader("Content-disposition", sbContentDispValue.toString()); response.setContentLength(baosPDF.size()); ServletOutputStream sos = response.getOutputStream(); baosPDF.writeTo(sos); sos.flush(); } finally { if (baosPDF != null) { baosPDF.reset(); } } return null; } public ActionForward printReceivingTicketPDF(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BulkReceivingForm blkRecForm = (BulkReceivingForm) form; BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkRecForm.getDocument(); String basePath = getApplicationBaseUrl(); String docId = blkRecDoc.getDocumentNumber(); String methodToCallPrintPurchaseOrderPDF = "printReceivingTicket"; String methodToCallDocHandler = "docHandler"; String printReceivingTicketPDFUrl = getUrlForPrintReceivingTicket(basePath, docId, methodToCallPrintPurchaseOrderPDF); String displayReceivingDocTabbedPageUrl = getUrlForPrintReceivingTicket(basePath, docId, methodToCallDocHandler); request.setAttribute("printReceivingTicketPDFUrl", printReceivingTicketPDFUrl); request.setAttribute("displayReceivingDocTabbedPageUrl", displayReceivingDocTabbedPageUrl); String label = SpringContext.getBean(DataDictionaryService.class).getDocumentLabelByTypeName(KFSConstants.FinancialDocumentTypeCodes.BULK_RECEIVING); request.setAttribute("receivingDocLabel", label); return mapping.findForward("printReceivingTicketPDF"); } protected String getUrlForPrintReceivingTicket(String basePath, String docId, String methodToCall) { StringBuffer result = new StringBuffer(basePath); result.append("/purapBulkReceiving.do?methodToCall="); result.append(methodToCall); result.append("&docId="); result.append(docId); result.append("&command=displayDocSearchView"); return result.toString(); } @Override public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BulkReceivingForm blkRecForm = (BulkReceivingForm) form; BulkReceivingDocument blkRecDoc = (BulkReceivingDocument) blkRecForm.getDocument(); String refreshCaller = blkRecForm.getRefreshCaller(); PhoneNumberService phoneNumberService = SpringContext.getBean(PhoneNumberService.class); // Format phone numbers blkRecDoc.setInstitutionContactPhoneNumber(phoneNumberService.formatNumberIfPossible(blkRecDoc.getInstitutionContactPhoneNumber())); blkRecDoc.setRequestorPersonPhoneNumber(phoneNumberService.formatNumberIfPossible(blkRecDoc.getRequestorPersonPhoneNumber())); blkRecDoc.setDeliveryToPhoneNumber(phoneNumberService.formatNumberIfPossible(blkRecDoc.getDeliveryToPhoneNumber())); // Refreshing the fields after returning from a vendor lookup in the vendor tab if (StringUtils.equals(refreshCaller, VendorConstants.VENDOR_LOOKUPABLE_IMPL) && blkRecDoc.getVendorDetailAssignedIdentifier() != null && blkRecDoc.getVendorHeaderGeneratedIdentifier() != null) { // retrieve vendor based on selection from vendor lookup blkRecDoc.refreshReferenceObject("vendorDetail"); blkRecDoc.setVendorName(blkRecDoc.getVendorDetail().getVendorName()); // populate default address based on selected vendor VendorAddress defaultAddress = SpringContext.getBean(VendorService.class).getVendorDefaultAddress(blkRecDoc.getVendorDetail().getVendorAddresses(), blkRecDoc.getVendorDetail().getVendorHeader().getVendorType().getAddressType().getVendorAddressTypeCode(), ""); if (ObjectUtils.isNotNull(defaultAddress)) { blkRecDoc.setVendorLine1Address(defaultAddress.getVendorLine1Address()); blkRecDoc.setVendorLine2Address(defaultAddress.getVendorLine2Address()); blkRecDoc.setVendorCityName(defaultAddress.getVendorCityName()); blkRecDoc.setVendorStateCode(defaultAddress.getVendorStateCode()); blkRecDoc.setVendorPostalCode(defaultAddress.getVendorZipCode()); blkRecDoc.setVendorCountryCode(defaultAddress.getVendorCountryCode()); } } // Refreshing the fields after returning from an address lookup in the vendor tab if (StringUtils.equals(refreshCaller, VendorConstants.VENDOR_ADDRESS_LOOKUPABLE_IMPL)) { if (StringUtils.isNotEmpty(request.getParameter(KFSPropertyConstants.DOCUMENT + "." + PurapPropertyConstants.VENDOR_ADDRESS_ID))) { // retrieve address based on selection from address lookup VendorAddress refreshVendorAddress = new VendorAddress(); refreshVendorAddress.setVendorAddressGeneratedIdentifier(blkRecDoc.getVendorAddressGeneratedIdentifier()); refreshVendorAddress = (VendorAddress) SpringContext.getBean(BusinessObjectService.class).retrieve(refreshVendorAddress); if (ObjectUtils.isNotNull(refreshVendorAddress)) { blkRecDoc.setVendorLine1Address(refreshVendorAddress.getVendorLine1Address()); blkRecDoc.setVendorLine2Address(refreshVendorAddress.getVendorLine2Address()); blkRecDoc.setVendorCityName(refreshVendorAddress.getVendorCityName()); blkRecDoc.setVendorStateCode(refreshVendorAddress.getVendorStateCode()); blkRecDoc.setVendorPostalCode(refreshVendorAddress.getVendorZipCode()); blkRecDoc.setVendorCountryCode(refreshVendorAddress.getVendorCountryCode()); } } } // Refreshing corresponding fields after returning from various kuali lookups if (StringUtils.equals(refreshCaller, KFSConstants.KUALI_LOOKUPABLE_IMPL)) { if (request.getParameter("document.deliveryCampusCode") != null) { // returning from a building or campus lookup on the delivery tab if (request.getParameter("document.deliveryBuildingName") == null) { // came from campus lookup not building, so clear building blkRecDoc.setDeliveryBuildingCode(""); blkRecDoc.setDeliveryBuildingLine1Address(""); blkRecDoc.setDeliveryBuildingLine2Address(""); blkRecDoc.setDeliveryBuildingRoomNumber(""); blkRecDoc.setDeliveryCityName(""); blkRecDoc.setDeliveryStateCode(""); blkRecDoc.setDeliveryPostalCode(""); blkRecDoc.setDeliveryCountryCode(""); } else { // came from building lookup then turn off "OTHER" and clear room and line2address blkRecDoc.setDeliveryBuildingOtherIndicator(false); blkRecDoc.setDeliveryBuildingRoomNumber(""); blkRecDoc.setDeliveryBuildingLine2Address(""); } } } return super.refresh(mapping, form, request, response); } /** * Setup document to use "OTHER" building * * @param mapping An ActionMapping * @param form An ActionForm * @param request A HttpServletRequest * @param response A HttpServletResponse * @return An ActionForward * @throws Exception */ public ActionForward useOtherDeliveryBuilding(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BulkReceivingForm baseForm = (BulkReceivingForm) form; BulkReceivingDocument document = (BulkReceivingDocument) baseForm.getDocument(); document.setDeliveryBuildingOtherIndicator(true); document.setDeliveryBuildingName(""); document.setDeliveryBuildingCode(""); document.setDeliveryBuildingLine1Address(""); document.setDeliveryBuildingLine2Address(""); document.setDeliveryBuildingRoomNumber(""); document.setDeliveryCityName(""); document.setDeliveryStateCode(""); document.setDeliveryCountryCode(""); document.setDeliveryPostalCode(""); return mapping.findForward(KFSConstants.MAPPING_BASIC); } @Override protected void populateAdHocActionRequestCodes(KualiDocumentFormBase formBase){ Document document = formBase.getDocument(); DocumentAuthorizer documentAuthorizer = getDocumentHelperService().getDocumentAuthorizer(document); Map<String,String> adHocActionRequestCodes = new HashMap<String,String>(); if (documentAuthorizer.canSendAdHocRequests(document, KewApiConstants.ACTION_REQUEST_FYI_REQ, GlobalVariables.getUserSession().getPerson())) { adHocActionRequestCodes.put(KewApiConstants.ACTION_REQUEST_FYI_REQ, KewApiConstants.ACTION_REQUEST_FYI_REQ_LABEL); } if ( (document.getDocumentHeader().getWorkflowDocument().isInitiated() || document.getDocumentHeader().getWorkflowDocument().isSaved() || document.getDocumentHeader().getWorkflowDocument().isEnroute() )&& documentAuthorizer.canSendAdHocRequests(document, KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ, GlobalVariables.getUserSession().getPerson())) { adHocActionRequestCodes.put(KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ, KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ_LABEL); } formBase.setAdHocActionRequestCodes(adHocActionRequestCodes); } }