/* * 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; import java.sql.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.module.purap.businessobject.Carrier; import org.kuali.kfs.module.purap.businessobject.DeliveryRequiredDateReason; import org.kuali.kfs.module.purap.businessobject.PurchaseOrderView; import org.kuali.kfs.module.purap.businessobject.SensitiveData; import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; import org.kuali.kfs.module.purap.document.service.ReceivingService; import org.kuali.kfs.module.purap.service.SensitiveDataService; import org.kuali.kfs.module.purap.util.PurApRelatedViews; import org.kuali.kfs.module.purap.util.PurapSearchUtils; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase; import org.kuali.kfs.vnd.businessobject.CampusParameter; import org.kuali.kfs.vnd.businessobject.VendorDetail; import org.kuali.rice.kew.api.KewApiServiceLocator; import org.kuali.rice.kew.api.WorkflowDocument; import org.kuali.rice.kew.api.action.ActionRequestType; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange; import org.kuali.rice.krad.service.KualiModuleService; import org.kuali.rice.krad.service.ModuleService; import org.kuali.rice.krad.util.NoteType; import org.kuali.rice.krad.util.ObjectUtils; import org.kuali.rice.location.api.LocationConstants; import org.kuali.rice.location.api.country.Country; import org.kuali.rice.location.api.country.CountryService; import org.kuali.rice.location.framework.country.CountryEbo; public abstract class ReceivingDocumentBase extends FinancialSystemTransactionalDocumentBase implements ReceivingDocument { protected String carrierCode; protected String shipmentPackingSlipNumber; protected String shipmentReferenceNumber; protected String shipmentBillOfLadingNumber; protected Date shipmentReceivedDate; protected Integer vendorHeaderGeneratedIdentifier; protected Integer vendorDetailAssignedIdentifier; protected String vendorName; protected String vendorLine1Address; protected String vendorLine2Address; protected String vendorCityName; protected String vendorStateCode; protected String vendorPostalCode; protected String vendorCountryCode; protected String deliveryCampusCode; protected boolean deliveryBuildingOtherIndicator; protected String deliveryBuildingCode; protected String deliveryBuildingName; protected String deliveryBuildingRoomNumber; protected String deliveryBuildingLine1Address; protected String deliveryBuildingLine2Address; protected String deliveryCityName; protected String deliveryStateCode; protected String deliveryPostalCode; protected String deliveryCountryCode; protected String deliveryToName; protected String deliveryToEmailAddress; protected String deliveryToPhoneNumber; protected Date deliveryRequiredDate; protected String deliveryInstructionText; protected String deliveryRequiredDateReasonCode; protected Integer alternateVendorHeaderGeneratedIdentifier; protected Integer alternateVendorDetailAssignedIdentifier; protected String alternateVendorName; //not persisted in db protected String vendorNumber; protected Integer vendorAddressGeneratedIdentifier; protected String alternateVendorNumber; protected boolean sensitive; protected CampusParameter deliveryCampus; protected CountryEbo vendorCountry; protected Carrier carrier; protected VendorDetail vendorDetail; protected DeliveryRequiredDateReason deliveryRequiredDateReason; protected Integer purchaseOrderIdentifier; protected Integer accountsPayablePurchasingDocumentLinkIdentifier; protected transient PurchaseOrderDocument purchaseOrderDocument; protected transient PurApRelatedViews relatedViews; public ReceivingDocumentBase(){ super(); } public boolean isSensitive() { List<SensitiveData> sensitiveData = SpringContext.getBean(SensitiveDataService.class).getSensitiveDatasAssignedByRelatedDocId(getAccountsPayablePurchasingDocumentLinkIdentifier()); if (ObjectUtils.isNotNull(sensitiveData) && !sensitiveData.isEmpty()) { return true; } return false; } @Override public String getCarrierCode() { return carrierCode; } @Override public void setCarrierCode(String carrierCode) { this.carrierCode = carrierCode; } @Override public String getShipmentPackingSlipNumber() { return shipmentPackingSlipNumber; } @Override public void setShipmentPackingSlipNumber(String shipmentPackingSlipNumber) { this.shipmentPackingSlipNumber = shipmentPackingSlipNumber; } @Override public String getShipmentReferenceNumber() { return shipmentReferenceNumber; } @Override public void setShipmentReferenceNumber(String shipmentReferenceNumber) { this.shipmentReferenceNumber = shipmentReferenceNumber; } @Override public String getShipmentBillOfLadingNumber() { return shipmentBillOfLadingNumber; } @Override public void setShipmentBillOfLadingNumber(String shipmentBillOfLadingNumber) { this.shipmentBillOfLadingNumber = shipmentBillOfLadingNumber; } @Override public Date getShipmentReceivedDate() { return shipmentReceivedDate; } @Override public void setShipmentReceivedDate(Date shipmentReceivedDate) { this.shipmentReceivedDate = shipmentReceivedDate; } @Override public Integer getVendorHeaderGeneratedIdentifier() { return vendorHeaderGeneratedIdentifier; } @Override public void setVendorHeaderGeneratedIdentifier(Integer vendorHeaderGeneratedIdentifier) { this.vendorHeaderGeneratedIdentifier = vendorHeaderGeneratedIdentifier; } @Override public Integer getVendorDetailAssignedIdentifier() { return vendorDetailAssignedIdentifier; } @Override public void setVendorDetailAssignedIdentifier(Integer vendorDetailAssignedIdentifier) { this.vendorDetailAssignedIdentifier = vendorDetailAssignedIdentifier; } @Override public String getVendorName() { return vendorName; } @Override public void setVendorName(String vendorName) { this.vendorName = vendorName; } @Override public String getVendorLine1Address() { return vendorLine1Address; } @Override public void setVendorLine1Address(String vendorLine1Address) { this.vendorLine1Address = vendorLine1Address; } @Override public String getVendorLine2Address() { return vendorLine2Address; } @Override public void setVendorLine2Address(String vendorLine2Address) { this.vendorLine2Address = vendorLine2Address; } @Override public String getVendorCityName() { return vendorCityName; } @Override public void setVendorCityName(String vendorCityName) { this.vendorCityName = vendorCityName; } @Override public String getVendorStateCode() { return vendorStateCode; } @Override public void setVendorStateCode(String vendorStateCode) { this.vendorStateCode = vendorStateCode; } @Override public String getVendorPostalCode() { return vendorPostalCode; } @Override public void setVendorPostalCode(String vendorPostalCode) { this.vendorPostalCode = vendorPostalCode; } @Override public String getVendorCountryCode() { return vendorCountryCode; } @Override public void setVendorCountryCode(String vendorCountryCode) { this.vendorCountryCode = vendorCountryCode; } @Override public String getDeliveryCampusCode() { return deliveryCampusCode; } @Override public void setDeliveryCampusCode(String deliveryCampusCode) { this.deliveryCampusCode = deliveryCampusCode; } @Override public String getDeliveryBuildingCode() { return deliveryBuildingCode; } @Override public void setDeliveryBuildingCode(String deliveryBuildingCode) { this.deliveryBuildingCode = deliveryBuildingCode; } @Override public String getDeliveryBuildingName() { return deliveryBuildingName; } @Override public void setDeliveryBuildingName(String deliveryBuildingName) { this.deliveryBuildingName = deliveryBuildingName; } @Override public String getDeliveryBuildingRoomNumber() { return deliveryBuildingRoomNumber; } @Override public void setDeliveryBuildingRoomNumber(String deliveryBuildingRoomNumber) { this.deliveryBuildingRoomNumber = deliveryBuildingRoomNumber; } @Override public String getDeliveryBuildingLine1Address() { return deliveryBuildingLine1Address; } @Override public void setDeliveryBuildingLine1Address(String deliveryBuildingLine1Address) { this.deliveryBuildingLine1Address = deliveryBuildingLine1Address; } @Override public String getDeliveryBuildingLine2Address() { return deliveryBuildingLine2Address; } @Override public void setDeliveryBuildingLine2Address(String deliveryBuildingLine2Address) { this.deliveryBuildingLine2Address = deliveryBuildingLine2Address; } @Override public String getDeliveryCityName() { return deliveryCityName; } @Override public void setDeliveryCityName(String deliveryCityName) { this.deliveryCityName = deliveryCityName; } @Override public String getDeliveryStateCode() { return deliveryStateCode; } @Override public void setDeliveryStateCode(String deliveryStateCode) { this.deliveryStateCode = deliveryStateCode; } @Override public String getDeliveryPostalCode() { return deliveryPostalCode; } @Override public void setDeliveryPostalCode(String deliveryPostalCode) { this.deliveryPostalCode = deliveryPostalCode; } @Override public String getDeliveryCountryCode() { return deliveryCountryCode; } @Override public void setDeliveryCountryCode(String deliveryCountryCode) { this.deliveryCountryCode = deliveryCountryCode; } @Override public String getDeliveryCountryName() { if ( StringUtils.isNotBlank(getDeliveryCountryCode()) ) { Country country = SpringContext.getBean(CountryService.class).getCountry(getDeliveryCountryCode()); if (country != null) { return country.getName(); } } return null; } @Override public String getDeliveryToName() { return deliveryToName; } @Override public void setDeliveryToName(String deliveryToName) { this.deliveryToName = deliveryToName; } @Override public String getDeliveryToEmailAddress() { return deliveryToEmailAddress; } @Override public void setDeliveryToEmailAddress(String deliveryToEmailAddress) { this.deliveryToEmailAddress = deliveryToEmailAddress; } @Override public String getDeliveryToPhoneNumber() { return deliveryToPhoneNumber; } @Override public void setDeliveryToPhoneNumber(String deliveryToPhoneNumber) { this.deliveryToPhoneNumber = deliveryToPhoneNumber; } @Override public Date getDeliveryRequiredDate() { return deliveryRequiredDate; } @Override public void setDeliveryRequiredDate(Date deliveryRequiredDate) { this.deliveryRequiredDate = deliveryRequiredDate; } @Override public String getDeliveryInstructionText() { return deliveryInstructionText; } @Override public void setDeliveryInstructionText(String deliveryInstructionText) { this.deliveryInstructionText = deliveryInstructionText; } @Override public String getDeliveryRequiredDateReasonCode() { return deliveryRequiredDateReasonCode; } @Override public void setDeliveryRequiredDateReasonCode(String deliveryRequiredDateReasonCode) { this.deliveryRequiredDateReasonCode = deliveryRequiredDateReasonCode; } @Override public CampusParameter getDeliveryCampus() { return deliveryCampus; } /** * @deprecated */ @Deprecated public void setDeliveryCampus(CampusParameter deliveryCampus) { this.deliveryCampus = deliveryCampus; } @Override public Carrier getCarrier() { return carrier; } /** * @deprecated */ @Deprecated public void setCarrier(Carrier carrier) { this.carrier = carrier; } @Override public DeliveryRequiredDateReason getDeliveryRequiredDateReason() { return deliveryRequiredDateReason; } /** * @deprecated */ @Deprecated public void setDeliveryRequiredDateReason(DeliveryRequiredDateReason deliveryRequiredDateReason) { this.deliveryRequiredDateReason = deliveryRequiredDateReason; } /** * Gets the vendorCountryCode attribute. * * @return Returns the vendorCountryCode. */ @Override public CountryEbo getVendorCountry() { if ( StringUtils.isBlank(vendorCountryCode) ) { vendorCountry = null; } else { if ( vendorCountry == null || !StringUtils.equals( vendorCountry.getCode(), vendorCountryCode) ) { ModuleService moduleService = SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(CountryEbo.class); if ( moduleService != null ) { Map<String,Object> keys = new HashMap<String, Object>(1); keys.put(LocationConstants.PrimaryKeyConstants.CODE, vendorCountryCode); vendorCountry = moduleService.getExternalizableBusinessObject(CountryEbo.class, keys); } else { throw new RuntimeException( "CONFIGURATION ERROR: No responsible module found for EBO class. Unable to proceed." ); } } } return vendorCountry; } /** * @deprecated */ @Deprecated public void setVendorCountry(CountryEbo vendorCountry) { this.vendorCountry = vendorCountry; } @Override public VendorDetail getVendorDetail() { return vendorDetail; } /** * @deprecated */ @Deprecated public void setVendorDetail(VendorDetail vendorDetail) { this.vendorDetail = vendorDetail; } @Override public String getVendorNumber() { if (StringUtils.isNotEmpty(vendorNumber)) { return vendorNumber; } else if (ObjectUtils.isNotNull(vendorDetail)) { return vendorDetail.getVendorNumber(); } else { return ""; } } @Override public void setVendorNumber(String vendorNumber) { this.vendorNumber = vendorNumber; } @Override public Integer getVendorAddressGeneratedIdentifier() { return vendorAddressGeneratedIdentifier; } @Override public void setVendorAddressGeneratedIdentifier(Integer vendorAddressGeneratedIdentifier) { this.vendorAddressGeneratedIdentifier = vendorAddressGeneratedIdentifier; } @Override public Integer getAlternateVendorDetailAssignedIdentifier() { return alternateVendorDetailAssignedIdentifier; } @Override public void setAlternateVendorDetailAssignedIdentifier(Integer alternateVendorDetailAssignedIdentifier) { this.alternateVendorDetailAssignedIdentifier = alternateVendorDetailAssignedIdentifier; } @Override public Integer getAlternateVendorHeaderGeneratedIdentifier() { return alternateVendorHeaderGeneratedIdentifier; } @Override public void setAlternateVendorHeaderGeneratedIdentifier(Integer alternateVendorHeaderGeneratedIdentifier) { this.alternateVendorHeaderGeneratedIdentifier = alternateVendorHeaderGeneratedIdentifier; } @Override public String getAlternateVendorName() { return alternateVendorName; } @Override public void setAlternateVendorName(String alternateVendorName) { this.alternateVendorName = alternateVendorName; } @Override public String getAlternateVendorNumber() { return alternateVendorNumber; } @Override public void setAlternateVendorNumber(String alternateVendorNumber) { this.alternateVendorNumber = alternateVendorNumber; } @Override public boolean isDeliveryBuildingOtherIndicator() { return deliveryBuildingOtherIndicator; } @Override public void setDeliveryBuildingOtherIndicator(boolean deliveryBuildingOtherIndicator) { this.deliveryBuildingOtherIndicator = deliveryBuildingOtherIndicator; } @Override public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) { super.doRouteStatusChange(statusChangeEvent); if(!(this instanceof BulkReceivingDocument)){ if(this.getFinancialSystemDocumentHeader().getWorkflowDocument().isProcessed()) { //delete unentered items and update po totals and save po SpringContext.getBean(ReceivingService.class).completeReceivingDocument(this); } } } @Override public abstract Class getItemClass(); public Integer getPurchaseOrderIdentifier() { return purchaseOrderIdentifier; } public void setPurchaseOrderIdentifier(Integer purchaseOrderIdentifier) { this.purchaseOrderIdentifier = purchaseOrderIdentifier; } @Override public Integer getAccountsPayablePurchasingDocumentLinkIdentifier() { return accountsPayablePurchasingDocumentLinkIdentifier; } @Override public void setAccountsPayablePurchasingDocumentLinkIdentifier(Integer accountsPayablePurchasingDocumentLinkIdentifier) { this.accountsPayablePurchasingDocumentLinkIdentifier = accountsPayablePurchasingDocumentLinkIdentifier; } @Override public PurchaseOrderDocument getPurchaseOrderDocument() { if ((ObjectUtils.isNull(this.purchaseOrderDocument) || ObjectUtils.isNull(this.purchaseOrderDocument.getPurapDocumentIdentifier())) && (ObjectUtils.isNotNull(getPurchaseOrderIdentifier()))) { setPurchaseOrderDocument(SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(this.getPurchaseOrderIdentifier())); } return this.purchaseOrderDocument; } @Override public void setPurchaseOrderDocument(PurchaseOrderDocument purchaseOrderDocument) { if (ObjectUtils.isNull(purchaseOrderDocument)) { this.purchaseOrderDocument = null; } else { if (ObjectUtils.isNotNull(purchaseOrderDocument.getPurapDocumentIdentifier())) { setPurchaseOrderIdentifier(purchaseOrderDocument.getPurapDocumentIdentifier()); } this.purchaseOrderDocument = purchaseOrderDocument; } } public PurApRelatedViews getRelatedViews() { if (relatedViews == null) { relatedViews = new PurApRelatedViews(this.documentNumber, this.accountsPayablePurchasingDocumentLinkIdentifier); } return relatedViews; } public void setRelatedViews(PurApRelatedViews relatedViews) { this.relatedViews = relatedViews; } public void initiateDocument(){ //initiate code } /** * FIXME: this is same as PurchaseOrderDoc please move somewhere appropriate * Sends FYI workflow request to the given user on this document. * * @param workflowDocument the associated workflow document. * @param userNetworkId the network ID of the user to be sent to. * @param annotation the annotation notes contained in this document. * @param responsibility the responsibility specified in the request. * @throws WorkflowException */ @Override public void appSpecificRouteDocumentToUser(WorkflowDocument workflowDocument, String routePrincipalId, String annotation, String responsibility) throws WorkflowException { if (ObjectUtils.isNotNull(workflowDocument)) { String annotationNote = (ObjectUtils.isNull(annotation)) ? "" : annotation; String responsibilityNote = (ObjectUtils.isNull(responsibility)) ? "" : responsibility; String currentNodeName = getCurrentRouteNodeName(workflowDocument); workflowDocument.adHocToPrincipal( ActionRequestType.FYI, currentNodeName, annotationNote, routePrincipalId, responsibilityNote, true); } } /** * FIXME: this is same as PurchaseOrderDoc please move somewhere appropriate * Returns the name of the current route node. * * @param wd the current workflow document. * @return the name of the current route node. * @throws WorkflowException */ protected String getCurrentRouteNodeName(WorkflowDocument wd) throws WorkflowException { Set<String> nodeNames = wd.getCurrentNodeNames(); if ((nodeNames == null) || (nodeNames.size() == 0)) { return null; } else { return (String)nodeNames.toArray()[0]; } } public boolean isBoNotesSupport() { return true; } @Override public String getAppDocStatus() { return this.getApplicationDocumentStatus(); } @Override public void setAppDocStatus(String appDocStatus) { this.setApplicationDocumentStatus(appDocStatus); } /** * Always returns true. * This method is needed here because it's called by some tag files shared with PurAp documents. */ @Override public boolean getIsATypeOfPurAPRecDoc() { return true; } /** * Always returns false. * This method is needed here because it's called by some tag files shared with PurAp documents. */ @Override public boolean getIsATypeOfPurDoc() { return false; } /** * Always returns false. * This method is needed here because it's called by some tag files shared with PurAp documents. */ @Override public boolean getIsATypeOfPODoc() { return false; } /** * Always returns false. * This method is needed here because it's called by some tag files shared with PurAp documents. */ @Override public boolean getIsPODoc() { return false; } /** * Always returns false. * This method is needed here because it's called by some tag files shared with PurAp documents. */ @Override public boolean getIsReqsDoc() { return false; } public String getWorkflowStatusForResult(){ return PurapSearchUtils.getWorkFlowStatusString(getDocumentHeader()); } public java.util.Date getCreateDateForResult() { return new java.util.Date(this.getFinancialSystemDocumentHeader().getWorkflowDocument().getDateCreated().getMillis()); } public String getDocumentTitleForResult() throws WorkflowException{ return KewApiServiceLocator.getDocumentTypeService().getDocumentTypeByName(this.getFinancialSystemDocumentHeader().getWorkflowDocument().getDocumentTypeName()).getLabel(); } /** * Checks whether the related purchase order views need a warning to be displayed, * i.e. if at least one of the purchase orders has never been opened. * @return true if at least one related purchase order needs a warning; false otherwise */ public boolean getNeedWarningRelatedPOs() { List<PurchaseOrderView> poViews = getRelatedViews().getRelatedPurchaseOrderViews(); for (PurchaseOrderView poView : poViews) { if (poView.getNeedWarning()) { return true; } } return false; } @Override public NoteType getNoteType() { return NoteType.BUSINESS_OBJECT; } }