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;
017    
018    import java.sql.Date;
019    import java.util.List;
020    
021    import org.apache.commons.lang.StringUtils;
022    import org.kuali.kfs.module.purap.PurapPropertyConstants;
023    import org.kuali.kfs.module.purap.businessobject.Carrier;
024    import org.kuali.kfs.module.purap.businessobject.DeliveryRequiredDateReason;
025    import org.kuali.kfs.module.purap.businessobject.LineItemReceivingStatus;
026    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderView;
027    import org.kuali.kfs.module.purap.businessobject.SensitiveData;
028    import org.kuali.kfs.module.purap.document.service.PurchaseOrderService;
029    import org.kuali.kfs.module.purap.document.service.ReceivingService;
030    import org.kuali.kfs.module.purap.service.SensitiveDataService;
031    import org.kuali.kfs.module.purap.util.PurApRelatedViews;
032    import org.kuali.kfs.module.purap.util.PurapSearchUtils;
033    import org.kuali.kfs.sys.KFSConstants;
034    import org.kuali.kfs.sys.context.SpringContext;
035    import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase;
036    import org.kuali.kfs.vnd.businessobject.CampusParameter;
037    import org.kuali.kfs.vnd.businessobject.VendorDetail;
038    import org.kuali.rice.kew.dto.DocumentRouteStatusChangeDTO;
039    import org.kuali.rice.kew.exception.WorkflowException;
040    import org.kuali.rice.kew.util.KEWConstants;
041    import org.kuali.rice.kim.bo.entity.KimPrincipal;
042    import org.kuali.rice.kim.service.IdentityManagementService;
043    import org.kuali.rice.kns.bo.Country;
044    import org.kuali.rice.kns.service.CountryService;
045    import org.kuali.rice.kns.util.ObjectUtils;
046    import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
047    import org.kuali.rice.kns.workflow.service.KualiWorkflowInfo;
048    
049    public abstract class ReceivingDocumentBase extends FinancialSystemTransactionalDocumentBase implements ReceivingDocument {
050    
051        protected String carrierCode;
052        protected String shipmentPackingSlipNumber;
053        protected String shipmentReferenceNumber;
054        protected String shipmentBillOfLadingNumber;
055        protected Date shipmentReceivedDate;
056        protected Integer vendorHeaderGeneratedIdentifier;
057        protected Integer vendorDetailAssignedIdentifier;
058        protected String vendorName;
059        protected String vendorLine1Address;
060        protected String vendorLine2Address;
061        protected String vendorCityName;
062        protected String vendorStateCode;
063        protected String vendorPostalCode;
064        protected String vendorCountryCode;
065        protected String deliveryCampusCode;
066        protected boolean deliveryBuildingOtherIndicator;
067        protected String deliveryBuildingCode;
068        protected String deliveryBuildingName;
069        protected String deliveryBuildingRoomNumber;
070        protected String deliveryBuildingLine1Address;
071        protected String deliveryBuildingLine2Address;
072        protected String deliveryCityName;
073        protected String deliveryStateCode;
074        protected String deliveryPostalCode;
075        protected String deliveryCountryCode;
076        protected String deliveryToName;
077        protected String deliveryToEmailAddress;
078        protected String deliveryToPhoneNumber;
079        protected Date deliveryRequiredDate;
080        protected String deliveryInstructionText;
081        protected String deliveryRequiredDateReasonCode;
082        protected String lineItemReceivingStatusCode;
083        protected String lineItemReceivingStatusDescription;
084    
085        protected Integer alternateVendorHeaderGeneratedIdentifier;
086        protected Integer alternateVendorDetailAssignedIdentifier;
087        protected String alternateVendorName;
088        
089        //not persisted in db
090        protected String vendorNumber;
091        protected Integer vendorAddressGeneratedIdentifier;
092        protected String alternateVendorNumber;
093        protected boolean sensitive;
094    
095        protected CampusParameter deliveryCampus;
096        protected Country vendorCountry;
097        protected Carrier carrier;
098        protected VendorDetail vendorDetail;
099        protected DeliveryRequiredDateReason deliveryRequiredDateReason;
100        protected LineItemReceivingStatus lineItemReceivingStatus;
101        protected Integer purchaseOrderIdentifier;
102        protected Integer accountsPayablePurchasingDocumentLinkIdentifier;
103        protected transient PurchaseOrderDocument purchaseOrderDocument;
104    
105        protected transient PurApRelatedViews relatedViews;
106    
107        public ReceivingDocumentBase(){
108            super();           
109        }
110            
111        public boolean isSensitive() {
112            List<SensitiveData> sensitiveData = SpringContext.getBean(SensitiveDataService.class).getSensitiveDatasAssignedByRelatedDocId(getAccountsPayablePurchasingDocumentLinkIdentifier());
113            if (ObjectUtils.isNotNull(sensitiveData) && !sensitiveData.isEmpty()) {
114                return true;
115            }
116            return false;
117        }
118    
119        public String getCarrierCode() { 
120            return carrierCode;
121        }
122        public void setCarrierCode(String carrierCode) {
123            this.carrierCode = carrierCode;
124        }
125    
126        public String getShipmentPackingSlipNumber() { 
127            return shipmentPackingSlipNumber;
128        }
129    
130        public void setShipmentPackingSlipNumber(String shipmentPackingSlipNumber) {
131            this.shipmentPackingSlipNumber = shipmentPackingSlipNumber;
132        }
133    
134        public String getShipmentReferenceNumber() { 
135            return shipmentReferenceNumber;
136        }
137    
138        public void setShipmentReferenceNumber(String shipmentReferenceNumber) {
139            this.shipmentReferenceNumber = shipmentReferenceNumber;
140        }
141    
142        public String getShipmentBillOfLadingNumber() { 
143            return shipmentBillOfLadingNumber;
144        }
145    
146        public void setShipmentBillOfLadingNumber(String shipmentBillOfLadingNumber) {
147            this.shipmentBillOfLadingNumber = shipmentBillOfLadingNumber;
148        }
149    
150        public Date getShipmentReceivedDate() { 
151            return shipmentReceivedDate;
152        }
153    
154        public void setShipmentReceivedDate(Date shipmentReceivedDate) {
155            this.shipmentReceivedDate = shipmentReceivedDate;
156        }
157    
158        public Integer getVendorHeaderGeneratedIdentifier() { 
159            return vendorHeaderGeneratedIdentifier;
160        }
161    
162        public void setVendorHeaderGeneratedIdentifier(Integer vendorHeaderGeneratedIdentifier) {
163            this.vendorHeaderGeneratedIdentifier = vendorHeaderGeneratedIdentifier;
164        }
165    
166        public Integer getVendorDetailAssignedIdentifier() { 
167            return vendorDetailAssignedIdentifier;
168        }
169    
170        public void setVendorDetailAssignedIdentifier(Integer vendorDetailAssignedIdentifier) {
171            this.vendorDetailAssignedIdentifier = vendorDetailAssignedIdentifier;
172        }
173    
174        public String getVendorName() { 
175            return vendorName;
176        }
177    
178        public void setVendorName(String vendorName) {
179            this.vendorName = vendorName;
180        }
181    
182        public String getVendorLine1Address() { 
183            return vendorLine1Address;
184        }
185    
186        public void setVendorLine1Address(String vendorLine1Address) {
187            this.vendorLine1Address = vendorLine1Address;
188        }
189    
190        public String getVendorLine2Address() { 
191            return vendorLine2Address;
192        }
193    
194        public void setVendorLine2Address(String vendorLine2Address) {
195            this.vendorLine2Address = vendorLine2Address;
196        }
197    
198        public String getVendorCityName() { 
199            return vendorCityName;
200        }
201    
202        public void setVendorCityName(String vendorCityName) {
203            this.vendorCityName = vendorCityName;
204        }
205    
206        public String getVendorStateCode() { 
207            return vendorStateCode;
208        }
209    
210        public void setVendorStateCode(String vendorStateCode) {
211            this.vendorStateCode = vendorStateCode;
212        }
213    
214        public String getVendorPostalCode() { 
215            return vendorPostalCode;
216        }
217    
218        public void setVendorPostalCode(String vendorPostalCode) {
219            this.vendorPostalCode = vendorPostalCode;
220        }
221    
222        public String getVendorCountryCode() { 
223            return vendorCountryCode;
224        }
225    
226        public void setVendorCountryCode(String vendorCountryCode) {
227            this.vendorCountryCode = vendorCountryCode;
228        }
229    
230        public String getDeliveryCampusCode() { 
231            return deliveryCampusCode;
232        }
233    
234        public void setDeliveryCampusCode(String deliveryCampusCode) {
235            this.deliveryCampusCode = deliveryCampusCode;
236        }
237    
238        public String getDeliveryBuildingCode() { 
239            return deliveryBuildingCode;
240        }
241    
242        public void setDeliveryBuildingCode(String deliveryBuildingCode) {
243            this.deliveryBuildingCode = deliveryBuildingCode;
244        }
245    
246        public String getDeliveryBuildingName() { 
247            return deliveryBuildingName;
248        }
249    
250        public void setDeliveryBuildingName(String deliveryBuildingName) {
251            this.deliveryBuildingName = deliveryBuildingName;
252        }
253    
254        public String getDeliveryBuildingRoomNumber() { 
255            return deliveryBuildingRoomNumber;
256        }
257    
258        public void setDeliveryBuildingRoomNumber(String deliveryBuildingRoomNumber) {
259            this.deliveryBuildingRoomNumber = deliveryBuildingRoomNumber;
260        }
261    
262        public String getDeliveryBuildingLine1Address() { 
263            return deliveryBuildingLine1Address;
264        }
265    
266        public void setDeliveryBuildingLine1Address(String deliveryBuildingLine1Address) {
267            this.deliveryBuildingLine1Address = deliveryBuildingLine1Address;
268        }
269    
270        public String getDeliveryBuildingLine2Address() { 
271            return deliveryBuildingLine2Address;
272        }
273    
274        public void setDeliveryBuildingLine2Address(String deliveryBuildingLine2Address) {
275            this.deliveryBuildingLine2Address = deliveryBuildingLine2Address;
276        }
277    
278        public String getDeliveryCityName() { 
279            return deliveryCityName;
280        }
281    
282        public void setDeliveryCityName(String deliveryCityName) {
283            this.deliveryCityName = deliveryCityName;
284        }
285    
286        public String getDeliveryStateCode() { 
287            return deliveryStateCode;
288        }
289    
290        public void setDeliveryStateCode(String deliveryStateCode) {
291            this.deliveryStateCode = deliveryStateCode;
292        }
293    
294        public String getDeliveryPostalCode() { 
295            return deliveryPostalCode;
296        }
297    
298        public void setDeliveryPostalCode(String deliveryPostalCode) {
299            this.deliveryPostalCode = deliveryPostalCode;
300        }
301    
302        public String getDeliveryCountryCode() { 
303            return deliveryCountryCode;
304        }
305    
306        public void setDeliveryCountryCode(String deliveryCountryCode) {
307            this.deliveryCountryCode = deliveryCountryCode;
308        }
309    
310        public String getDeliveryCountryName() {
311            Country country = SpringContext.getBean(CountryService.class).getByPrimaryId(getDeliveryCountryCode());
312            if (country != null)
313                return country.getPostalCountryName();
314            return null;
315        }
316           
317        public String getDeliveryToName() { 
318            return deliveryToName;
319        }
320    
321        public void setDeliveryToName(String deliveryToName) {
322            this.deliveryToName = deliveryToName;
323        }
324    
325        public String getDeliveryToEmailAddress() { 
326            return deliveryToEmailAddress;
327        }
328    
329        public void setDeliveryToEmailAddress(String deliveryToEmailAddress) {
330            this.deliveryToEmailAddress = deliveryToEmailAddress;
331        }
332    
333        public String getDeliveryToPhoneNumber() { 
334            return deliveryToPhoneNumber;
335        }
336    
337        public void setDeliveryToPhoneNumber(String deliveryToPhoneNumber) {
338            this.deliveryToPhoneNumber = deliveryToPhoneNumber;
339        }
340    
341        public Date getDeliveryRequiredDate() { 
342            return deliveryRequiredDate;
343        }
344    
345        public void setDeliveryRequiredDate(Date deliveryRequiredDate) {
346            this.deliveryRequiredDate = deliveryRequiredDate;
347        }
348    
349        public String getDeliveryInstructionText() { 
350            return deliveryInstructionText;
351        }
352    
353        public void setDeliveryInstructionText(String deliveryInstructionText) {
354            this.deliveryInstructionText = deliveryInstructionText;
355        }
356    
357        public String getDeliveryRequiredDateReasonCode() { 
358            return deliveryRequiredDateReasonCode;
359        }
360    
361        public void setDeliveryRequiredDateReasonCode(String deliveryRequiredDateReasonCode) {
362            this.deliveryRequiredDateReasonCode = deliveryRequiredDateReasonCode;
363        }
364    
365        public CampusParameter getDeliveryCampus() {
366            return deliveryCampus;
367        }
368    
369        /**
370         * @deprecated
371         */
372        public void setDeliveryCampus(CampusParameter deliveryCampus) {
373            this.deliveryCampus = deliveryCampus;
374        }
375    
376        public Carrier getCarrier() {
377            return carrier;
378        }
379    
380        /**
381         * @deprecated
382         */
383        public void setCarrier(Carrier carrier) {
384            this.carrier = carrier;
385        }
386    
387        public DeliveryRequiredDateReason getDeliveryRequiredDateReason() {
388            return deliveryRequiredDateReason;
389        }
390    
391        /**
392         * @deprecated
393         */
394        public void setDeliveryRequiredDateReason(DeliveryRequiredDateReason deliveryRequiredDateReason) {
395            this.deliveryRequiredDateReason = deliveryRequiredDateReason;
396        }
397    
398        public Country getVendorCountry() {
399            vendorCountry = SpringContext.getBean(CountryService.class).getByPrimaryIdIfNecessary(vendorCountryCode, vendorCountry);
400            return vendorCountry;
401        }
402    
403        /**
404         * @deprecated
405         */
406        public void setVendorCountry(Country vendorCountry) {
407            this.vendorCountry = vendorCountry;
408        }
409    
410        public VendorDetail getVendorDetail() {
411            return vendorDetail;
412        }
413    
414        /**
415         * @deprecated
416         */
417        public void setVendorDetail(VendorDetail vendorDetail) {
418            this.vendorDetail = vendorDetail;
419        }
420    
421        public String getVendorNumber() {
422            if (StringUtils.isNotEmpty(vendorNumber)) {
423                return vendorNumber;
424            }
425            else if (ObjectUtils.isNotNull(vendorDetail)) {
426                return vendorDetail.getVendorNumber();
427            }
428            else
429                return "";
430        }
431    
432        public void setVendorNumber(String vendorNumber) {
433            this.vendorNumber = vendorNumber;
434        }
435    
436        public Integer getVendorAddressGeneratedIdentifier() {
437            return vendorAddressGeneratedIdentifier;
438        }
439    
440        public void setVendorAddressGeneratedIdentifier(Integer vendorAddressGeneratedIdentifier) {
441            this.vendorAddressGeneratedIdentifier = vendorAddressGeneratedIdentifier;
442        }
443    
444        public Integer getAlternateVendorDetailAssignedIdentifier() {
445            return alternateVendorDetailAssignedIdentifier;
446        }
447    
448        public void setAlternateVendorDetailAssignedIdentifier(Integer alternateVendorDetailAssignedIdentifier) {
449            this.alternateVendorDetailAssignedIdentifier = alternateVendorDetailAssignedIdentifier;
450        }
451    
452        public Integer getAlternateVendorHeaderGeneratedIdentifier() {
453            return alternateVendorHeaderGeneratedIdentifier;
454        }
455    
456        public void setAlternateVendorHeaderGeneratedIdentifier(Integer alternateVendorHeaderGeneratedIdentifier) {
457            this.alternateVendorHeaderGeneratedIdentifier = alternateVendorHeaderGeneratedIdentifier;
458        }
459    
460        public String getAlternateVendorName() {
461            return alternateVendorName;
462        }
463    
464        public void setAlternateVendorName(String alternateVendorName) {
465            this.alternateVendorName = alternateVendorName;
466        }
467    
468        public String getAlternateVendorNumber() {
469            return alternateVendorNumber;
470        }
471    
472        public void setAlternateVendorNumber(String alternateVendorNumber) {
473            this.alternateVendorNumber = alternateVendorNumber;
474        }
475    
476        public boolean isDeliveryBuildingOtherIndicator() {
477            return deliveryBuildingOtherIndicator;
478        }
479    
480        public void setDeliveryBuildingOtherIndicator(boolean deliveryBuildingOtherIndicator) {
481            this.deliveryBuildingOtherIndicator = deliveryBuildingOtherIndicator;
482        }
483    
484        @Override
485        public void doRouteStatusChange(DocumentRouteStatusChangeDTO statusChangeEvent) {
486            super.doRouteStatusChange(statusChangeEvent);
487            if(!(this instanceof BulkReceivingDocument)){
488                if(this.getDocumentHeader().getWorkflowDocument().stateIsProcessed()) {
489                    //delete unentered items and update po totals and save po
490                    SpringContext.getBean(ReceivingService.class).completeReceivingDocument(this);
491                }
492            }
493        }
494        
495        public abstract Class getItemClass();
496    
497        public Integer getPurchaseOrderIdentifier() { 
498            return purchaseOrderIdentifier;
499        }
500    
501        public void setPurchaseOrderIdentifier(Integer purchaseOrderIdentifier) {
502            this.purchaseOrderIdentifier = purchaseOrderIdentifier;
503        }
504    
505        public Integer getAccountsPayablePurchasingDocumentLinkIdentifier() {
506            return accountsPayablePurchasingDocumentLinkIdentifier;
507        }
508    
509        public void setAccountsPayablePurchasingDocumentLinkIdentifier(Integer accountsPayablePurchasingDocumentLinkIdentifier) {
510            this.accountsPayablePurchasingDocumentLinkIdentifier = accountsPayablePurchasingDocumentLinkIdentifier;
511        }
512    
513        public PurchaseOrderDocument getPurchaseOrderDocument() {
514            if ((ObjectUtils.isNull(this.purchaseOrderDocument) || ObjectUtils.isNull(this.purchaseOrderDocument.getPurapDocumentIdentifier())) && (ObjectUtils.isNotNull(getPurchaseOrderIdentifier()))) {
515                setPurchaseOrderDocument(SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(this.getPurchaseOrderIdentifier()));
516            }
517            return this.purchaseOrderDocument;
518        }
519    
520        public void setPurchaseOrderDocument(PurchaseOrderDocument purchaseOrderDocument) {
521            if (ObjectUtils.isNull(purchaseOrderDocument)) {
522                this.purchaseOrderDocument = null;
523            }
524            else {
525                if (ObjectUtils.isNotNull(purchaseOrderDocument.getPurapDocumentIdentifier())) {
526                    setPurchaseOrderIdentifier(purchaseOrderDocument.getPurapDocumentIdentifier());
527                }
528                this.purchaseOrderDocument = purchaseOrderDocument;
529            }
530        }
531    
532        public PurApRelatedViews getRelatedViews() {
533            if (relatedViews == null) {
534                relatedViews = new PurApRelatedViews(this.documentNumber, this.accountsPayablePurchasingDocumentLinkIdentifier);
535            }
536            return relatedViews;
537        }
538    
539        public void setRelatedViews(PurApRelatedViews relatedViews) {
540            this.relatedViews = relatedViews;
541        }
542    
543        public void initiateDocument(){
544            //initiate code
545        }
546    
547        /**
548         * FIXME: this is same as PurchaseOrderDoc please move somewhere appropriate
549         * Sends FYI workflow request to the given user on this document.
550         * 
551         * @param workflowDocument the associated workflow document.
552         * @param userNetworkId the network ID of the user to be sent to.
553         * @param annotation the annotation notes contained in this document.
554         * @param responsibility the responsibility specified in the request.
555         * @throws WorkflowException
556         */
557        public void appSpecificRouteDocumentToUser(KualiWorkflowDocument workflowDocument, String userNetworkId, String annotation, String responsibility) throws WorkflowException {
558            if (ObjectUtils.isNotNull(workflowDocument)) {
559                String annotationNote = (ObjectUtils.isNull(annotation)) ? "" : annotation;
560                String responsibilityNote = (ObjectUtils.isNull(responsibility)) ? "" : responsibility;
561                String currentNodeName = getCurrentRouteNodeName(workflowDocument);
562                KimPrincipal principal = SpringContext.getBean(IdentityManagementService.class).getPrincipalByPrincipalName(userNetworkId);
563                workflowDocument.adHocRouteDocumentToPrincipal(KEWConstants.ACTION_REQUEST_FYI_REQ, currentNodeName, annotationNote, principal.getPrincipalId(), responsibilityNote, true);
564            }
565        }
566        /**
567         * FIXME: this is same as PurchaseOrderDoc please move somewhere appropriate
568         * Returns the name of the current route node.
569         * 
570         * @param wd the current workflow document.
571         * @return the name of the current route node.
572         * @throws WorkflowException
573         */
574        protected String getCurrentRouteNodeName(KualiWorkflowDocument wd) throws WorkflowException {
575            String[] nodeNames = wd.getNodeNames();
576            if ((nodeNames == null) || (nodeNames.length == 0)) {
577                return null;
578            }
579            else {
580                return nodeNames[0];
581            }
582        }
583        
584        @Override
585        public boolean isBoNotesSupport() {
586            return true;
587        }
588    
589        public LineItemReceivingStatus getLineItemReceivingStatus() {
590            if (ObjectUtils.isNull(this.lineItemReceivingStatus) && StringUtils.isNotEmpty(this.getLineItemReceivingStatusCode()))  {
591                this.refreshReferenceObject(PurapPropertyConstants.LINE_ITEM_RECEIVING_STATUS);
592            }
593            return lineItemReceivingStatus;
594        }
595    
596        public void setLineItemReceivingStatus(LineItemReceivingStatus receivingLineStatus) {
597            this.lineItemReceivingStatus = receivingLineStatus;
598        }
599    
600        public String getLineItemReceivingStatusCode() {
601            return lineItemReceivingStatusCode;
602        }
603    
604        public void setLineItemReceivingStatusCode(String lineItemReceivingStatusCode) {
605            this.lineItemReceivingStatusCode = lineItemReceivingStatusCode;
606        }
607    
608        public String getLineItemReceivingStatusDescription() {
609            return lineItemReceivingStatusDescription;
610        }
611    
612        public void setLineItemReceivingStatusDescription(String lineItemReceivingStatusDescription) {
613            this.lineItemReceivingStatusDescription = lineItemReceivingStatusDescription;
614        }
615        
616        /**
617         * Always returns true. 
618         * This method is needed here because it's called by some tag files shared with PurAp documents.
619         */
620        public boolean getIsATypeOfPurAPRecDoc() {
621            return true;
622        }
623    
624        /**
625         * Always returns false. 
626         * This method is needed here because it's called by some tag files shared with PurAp documents.
627         */
628        public boolean getIsATypeOfPurDoc() {
629            return false;
630        }
631        
632        /**
633         * Always returns false. 
634         * This method is needed here because it's called by some tag files shared with PurAp documents.
635         */
636        public boolean getIsATypeOfPODoc() {
637            return false;
638        }
639        
640        /**
641         * Always returns false. 
642         * This method is needed here because it's called by some tag files shared with PurAp documents.
643         */
644        public boolean getIsPODoc() {
645            return false;
646        }
647        
648        /**
649         * Always returns false. 
650         * This method is needed here because it's called by some tag files shared with PurAp documents.
651         */
652        public boolean getIsReqsDoc() {
653            return false;
654        }       
655        
656        public String getWorkflowStatusForResult(){
657            return PurapSearchUtils.getWorkFlowStatusString(getDocumentHeader());
658        }
659        
660        public java.util.Date getCreateDateForResult() {
661            return new java.util.Date(getDocumentHeader().getWorkflowDocument().getCreateDate().getTime());
662        }
663        
664        public String getDocumentTitleForResult() throws WorkflowException{
665            return SpringContext.getBean(KualiWorkflowInfo.class).getDocType(this.getDocumentHeader().getWorkflowDocument().getDocumentType()).getDocTypeLabel();
666        }
667        
668        /**
669         * Checks whether the related purchase order views need a warning to be displayed, 
670         * i.e. if at least one of the purchase orders has never been opened.
671         * @return true if at least one related purchase order needs a warning; false otherwise
672         */
673        public boolean getNeedWarningRelatedPOs() {
674            List<PurchaseOrderView> poViews = getRelatedViews().getRelatedPurchaseOrderViews();
675            for (PurchaseOrderView poView : poViews) {
676                if (poView.getNeedWarning())
677                    return true;
678            }
679            return false;
680        }
681        
682    }