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    }