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 }