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 }