/*
* 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.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.kfs.module.purap.PurapConstants;
import org.kuali.kfs.module.purap.document.service.BulkReceivingService;
import org.kuali.kfs.module.purap.document.service.RequisitionService;
import org.kuali.kfs.module.purap.document.validation.event.AttributedContinuePurapEvent;
import org.kuali.kfs.module.purap.util.PurapSearchUtils;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.vnd.VendorConstants;
import org.kuali.kfs.vnd.businessobject.VendorAddress;
import org.kuali.kfs.vnd.businessobject.VendorDetail;
import org.kuali.kfs.vnd.document.service.VendorService;
import org.kuali.rice.core.api.datetime.DateTimeService;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kim.api.services.KimApiServiceLocator;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.krad.bo.DocumentHeader;
import org.kuali.rice.krad.rules.rule.event.KualiDocumentEvent;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADPropertyConstants;
import org.kuali.rice.location.api.country.Country;
import org.kuali.rice.location.api.country.CountryService;
public class BulkReceivingDocument extends ReceivingDocumentBase{
protected static final Logger LOG = Logger.getLogger(BulkReceivingDocument.class);
protected String shipmentWeight;
protected Integer noOfCartons;
protected String trackingNumber;
protected String vendorAddressInternationalProvinceName;
protected String vendorNoteText;
/**
* Goods delivered vendor
*/
protected Integer goodsDeliveredVendorHeaderGeneratedIdentifier;
protected Integer goodsDeliveredVendorDetailAssignedIdentifier;
protected String goodsDeliveredVendorNumber;
protected String deliveryAdditionalInstructionText;
protected String requestorPersonName;
protected String requestorPersonPhoneNumber;
protected String requestorPersonEmailAddress;
protected String preparerPersonName;
protected String preparerPersonPhoneNumber;
protected String deliveryCampusName;
protected String institutionContactName;
protected String institutionContactPhoneNumber;
protected String institutionContactEmailAddress;
protected VendorDetail alternateVendorDetail;
/**
* Not persisted in DB
*/
protected String goodsDeliveredVendorName;
protected String vendorContact;
public BulkReceivingDocument() {
super();
}
@Override
public void initiateDocument(){
setShipmentReceivedDate(SpringContext.getBean(DateTimeService.class).getCurrentSqlDate());
}
public void populateBulkReceivingFromPurchaseOrder(PurchaseOrderDocument po){
setPurchaseOrderIdentifier( po.getPurapDocumentIdentifier() );
getDocumentHeader().setOrganizationDocumentNumber( po.getDocumentHeader().getOrganizationDocumentNumber() );
setAccountsPayablePurchasingDocumentLinkIdentifier( po.getAccountsPayablePurchasingDocumentLinkIdentifier() );
//copy vendor
setVendorHeaderGeneratedIdentifier( po.getVendorHeaderGeneratedIdentifier() );
setVendorDetailAssignedIdentifier( po.getVendorDetailAssignedIdentifier() );
setVendorName( po.getVendorName() );
setVendorNumber( po.getVendorNumber() );
setVendorLine1Address( po.getVendorLine1Address() );
setVendorLine2Address( po.getVendorLine2Address() );
setVendorCityName( po.getVendorCityName() );
setVendorStateCode( po.getVendorStateCode() );
setVendorPostalCode( po.getVendorPostalCode() );
setVendorCountryCode( po.getVendorCountryCode() );
setVendorDetail(po.getVendorDetail());
setVendorNumber(po.getVendorNumber());
setVendorAddressInternationalProvinceName(po.getVendorAddressInternationalProvinceName());
setVendorNoteText(po.getVendorNoteText());
setVendorAddressGeneratedIdentifier(po.getVendorAddressGeneratedIdentifier());
//copy alternate vendor
setAlternateVendorName( po.getAlternateVendorName() );
setAlternateVendorNumber( StringUtils.isEmpty(po.getAlternateVendorNumber()) ? null : po.getAlternateVendorNumber());
setAlternateVendorDetailAssignedIdentifier( po.getAlternateVendorDetailAssignedIdentifier() );
setAlternateVendorHeaderGeneratedIdentifier( po.getAlternateVendorHeaderGeneratedIdentifier() );
//copy delivery
setDeliveryBuildingCode( po.getDeliveryBuildingCode() );
setDeliveryBuildingLine1Address( po.getDeliveryBuildingLine1Address() );
setDeliveryBuildingLine2Address( po.getDeliveryBuildingLine2Address() );
setDeliveryBuildingName( po.getDeliveryBuildingName() );
setDeliveryBuildingRoomNumber( po.getDeliveryBuildingRoomNumber() );
setDeliveryCampusCode( po.getDeliveryCampusCode() );
setDeliveryCityName( po.getDeliveryCityName() );
setDeliveryCountryCode( po.getDeliveryCountryCode() );
setDeliveryInstructionText( po.getDeliveryInstructionText() );
setDeliveryPostalCode( po.getDeliveryPostalCode() );
setDeliveryStateCode( po.getDeliveryStateCode() );
setDeliveryToEmailAddress( po.getDeliveryToEmailAddress() );
setDeliveryToName( po.getDeliveryToName() );
setDeliveryToPhoneNumber( po.getDeliveryToPhoneNumber() );
setInstitutionContactName(po.getInstitutionContactName());
setInstitutionContactPhoneNumber(po.getInstitutionContactPhoneNumber());
setInstitutionContactEmailAddress(po.getInstitutionContactEmailAddress());
//Requestor and Requisition preparer
setRequestorPersonName(po.getRequestorPersonName());
setRequestorPersonPhoneNumber(po.getRequestorPersonPhoneNumber());
setRequestorPersonEmailAddress(po.getRequestorPersonEmailAddress());
RequisitionDocument reqDoc = SpringContext.getBean(RequisitionService.class).getRequisitionById(po.getRequisitionIdentifier());
if (reqDoc != null){ // reqDoc is null when called from unit test
String requisitionPreparer = reqDoc.getFinancialSystemDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId();
/**
* This is to get the user name for display
*/
Person initiatorUser = KimApiServiceLocator.getPersonService().getPerson(requisitionPreparer);
setPreparerPersonName(initiatorUser.getName());
}
if (getVendorNumber() != null){
setGoodsDeliveredVendorHeaderGeneratedIdentifier(getVendorHeaderGeneratedIdentifier());
setGoodsDeliveredVendorDetailAssignedIdentifier(getVendorDetailAssignedIdentifier());
setGoodsDeliveredVendorNumber(getVendorNumber());
setGoodsDeliveredVendorName(getVendorName());
}
populateVendorDetails();
populateDocumentDescription(po);
}
protected void populateVendorDetails(){
if (getVendorHeaderGeneratedIdentifier() != null &&
getVendorDetailAssignedIdentifier() != null){
VendorDetail tempVendor = new VendorDetail();
tempVendor.setVendorHeaderGeneratedIdentifier(getVendorHeaderGeneratedIdentifier());
tempVendor.setVendorDetailAssignedIdentifier(getVendorDetailAssignedIdentifier());
setVendorNumber(tempVendor.getVendorNumber());
}
if (getAlternateVendorHeaderGeneratedIdentifier() != null &&
getAlternateVendorDetailAssignedIdentifier() != null){
VendorDetail vendorDetail = SpringContext.getBean(VendorService.class).getVendorDetail(getAlternateVendorHeaderGeneratedIdentifier(),
getAlternateVendorDetailAssignedIdentifier());
//copied from creditmemocreateserviceimpl.populatedocumentfromvendor
String userCampus = GlobalVariables.getUserSession().getPerson().getCampusCode();
VendorAddress vendorAddress = SpringContext.getBean(VendorService.class).getVendorDefaultAddress(getAlternateVendorHeaderGeneratedIdentifier(),
getAlternateVendorDetailAssignedIdentifier(),
VendorConstants.AddressTypes.REMIT,
userCampus);
if (vendorAddress == null) {
// pick up the default vendor po address type
vendorAddress = SpringContext.getBean(VendorService.class).getVendorDefaultAddress(getAlternateVendorHeaderGeneratedIdentifier(),
getAlternateVendorDetailAssignedIdentifier(),
VendorConstants.AddressTypes.PURCHASE_ORDER,
userCampus);
}
if (vendorAddress != null){
setAlternateVendorName(vendorDetail.getVendorName());
setAlternateVendorNumber(vendorDetail.getVendorNumber());
vendorDetail.setDefaultAddressLine1(vendorAddress.getVendorLine1Address());
vendorDetail.setDefaultAddressLine2(vendorAddress.getVendorLine2Address());
vendorDetail.setDefaultAddressCity(vendorAddress.getVendorCityName());
vendorDetail.setDefaultAddressCountryCode(vendorAddress.getVendorCountryCode());
vendorDetail.setDefaultAddressPostalCode(vendorAddress.getVendorZipCode());
vendorDetail.setDefaultAddressStateCode(vendorAddress.getVendorStateCode());
vendorDetail.setDefaultAddressInternationalProvince(vendorAddress.getVendorAddressInternationalProvinceName());
}
setAlternateVendorDetail(vendorDetail);
}
if (getGoodsDeliveredVendorHeaderGeneratedIdentifier() != null &&
getGoodsDeliveredVendorDetailAssignedIdentifier() != null){
VendorDetail tempVendor = new VendorDetail();
tempVendor.setVendorHeaderGeneratedIdentifier(getGoodsDeliveredVendorHeaderGeneratedIdentifier());
tempVendor.setVendorDetailAssignedIdentifier(getGoodsDeliveredVendorDetailAssignedIdentifier());
setGoodsDeliveredVendorNumber(tempVendor.getVendorNumber());
if (StringUtils.equals(getVendorNumber(),getGoodsDeliveredVendorNumber())){
setGoodsDeliveredVendorName(getVendorName());
}else {
setGoodsDeliveredVendorName(getAlternateVendorName());
}
}
}
/**
* Perform logic needed to clear the initial fields on a Receiving Line Document
*/
public void clearInitFields() {
// Clearing document overview fields
getDocumentHeader().setDocumentDescription(null);
getDocumentHeader().setExplanation(null);
getFinancialSystemDocumentHeader().setFinancialDocumentTotalAmount(null);
getDocumentHeader().setOrganizationDocumentNumber(null);
setPurchaseOrderIdentifier(null);
setShipmentReceivedDate(SpringContext.getBean(DateTimeService.class).getCurrentSqlDate());
setShipmentPackingSlipNumber(null);
setShipmentBillOfLadingNumber(null);
setCarrierCode(null);
}
@Override
public void processAfterRetrieve() {
super.processAfterRetrieve();
refreshNonUpdateableReferences();
populateVendorDetails();
}
@Override
public void prepareForSave(KualiDocumentEvent event) {
if (event instanceof AttributedContinuePurapEvent) {
SpringContext.getBean(BulkReceivingService.class).populateBulkReceivingFromPurchaseOrder(this);
if (getPurchaseOrderIdentifier() == null){
getDocumentHeader().setDocumentDescription(PurapConstants.BulkReceivingDocumentStrings.MESSAGE_BULK_RECEIVING_DEFAULT_DOC_DESCRIPTION);;
}
}else{
if (getGoodsDeliveredVendorNumber() != null){
VendorDetail tempVendor = new VendorDetail();
tempVendor.setVendorNumber(getGoodsDeliveredVendorNumber());
setGoodsDeliveredVendorHeaderGeneratedIdentifier(tempVendor.getVendorHeaderGeneratedIdentifier());
setGoodsDeliveredVendorDetailAssignedIdentifier(tempVendor.getVendorDetailAssignedIdentifier());
}
}
super.prepareForSave(event);
}
protected void populateDocumentDescription(PurchaseOrderDocument poDocument) {
String description = "PO: " + poDocument.getPurapDocumentIdentifier() + " Vendor: " + poDocument.getVendorName();
int noteTextMaxLength = SpringContext.getBean(DataDictionaryService.class).getAttributeMaxLength(DocumentHeader.class, KRADPropertyConstants.DOCUMENT_DESCRIPTION).intValue();
if (noteTextMaxLength < description.length()) {
description = description.substring(0, noteTextMaxLength);
}
getDocumentHeader().setDocumentDescription(description);
}
@Override
public String getDeliveryCountryName() {
if ( StringUtils.isNotBlank(getDeliveryCountryCode()) ) {
Country country = SpringContext.getBean(CountryService.class).getCountry(getDeliveryCountryCode());
if (country != null) {
return country.getName();
}
}
return null;
}
public String getGoodsDeliveredVendorNumber() {
return goodsDeliveredVendorNumber;
}
public void setGoodsDeliveredVendorNumber(String goodsDeliveredVendorNumber) {
this.goodsDeliveredVendorNumber = goodsDeliveredVendorNumber;
}
public Integer getNoOfCartons() {
return noOfCartons;
}
public void setNoOfCartons(Integer noOfCartons) {
this.noOfCartons = noOfCartons;
}
public String getVendorContact() {
return vendorContact;
}
public void setVendorContact(String vendorContact) {
this.vendorContact = vendorContact;
}
public VendorDetail getAlternateVendorDetail() {
return alternateVendorDetail;
}
public void setAlternateVendorDetail(VendorDetail alternateVendorDetail) {
this.alternateVendorDetail = alternateVendorDetail;
}
public String getShipmentWeight() {
return shipmentWeight;
}
public void setShipmentWeight(String shipmentWeight) {
this.shipmentWeight = shipmentWeight;
}
public String getGoodsDeliveredVendorName() {
return goodsDeliveredVendorName;
}
public void setGoodsDeliveredVendorName(String goodsDeliveredVendorName) {
this.goodsDeliveredVendorName = goodsDeliveredVendorName;
}
public String getVendorAddressInternationalProvinceName() {
return vendorAddressInternationalProvinceName;
}
public void setVendorAddressInternationalProvinceName(String vendorAddressInternationalProvinceName) {
this.vendorAddressInternationalProvinceName = vendorAddressInternationalProvinceName;
}
public String getDeliveryCampusName() {
return deliveryCampusName;
}
public void setDeliveryCampusName(String deliveryCampusName) {
this.deliveryCampusName = deliveryCampusName;
}
public String getRequestorPersonName() {
return requestorPersonName;
}
public void setRequestorPersonName(String requestorPersonName) {
this.requestorPersonName = requestorPersonName;
}
public String getRequestorPersonPhoneNumber() {
return requestorPersonPhoneNumber;
}
public void setRequestorPersonPhoneNumber(String requestorPersonPhoneNumber) {
this.requestorPersonPhoneNumber = requestorPersonPhoneNumber;
}
public String getPreparerPersonName() {
return preparerPersonName;
}
public void setPreparerPersonName(String preparerPersonName) {
this.preparerPersonName = preparerPersonName;
}
public String getPreparerPersonPhoneNumber() {
return preparerPersonPhoneNumber;
}
public void setPreparerPersonPhoneNumber(String preparerPersonPhoneNumber) {
this.preparerPersonPhoneNumber = preparerPersonPhoneNumber;
}
public String getTrackingNumber() {
return trackingNumber;
}
public void setTrackingNumber(String trackingNumber) {
this.trackingNumber = trackingNumber;
}
public String getVendorNoteText() {
return vendorNoteText;
}
public void setVendorNoteText(String vendorNoteText) {
this.vendorNoteText = vendorNoteText;
}
public String getRequestorPersonEmailAddress() {
return requestorPersonEmailAddress;
}
public void setRequestorPersonEmailAddress(String requestorPersonEmailAddress) {
this.requestorPersonEmailAddress = requestorPersonEmailAddress;
}
public String getInstitutionContactEmailAddress() {
return institutionContactEmailAddress;
}
public void setInstitutionContactEmailAddress(String institutionContactEmailAddress) {
this.institutionContactEmailAddress = institutionContactEmailAddress;
}
public String getInstitutionContactName() {
return institutionContactName;
}
public void setInstitutionContactName(String institutionContactName) {
this.institutionContactName = institutionContactName;
}
public String getInstitutionContactPhoneNumber() {
return institutionContactPhoneNumber;
}
public void setInstitutionContactPhoneNumber(String institutionContactPhoneNumber) {
this.institutionContactPhoneNumber = institutionContactPhoneNumber;
}
public String getDeliveryAdditionalInstructionText() {
return deliveryAdditionalInstructionText;
}
public void setDeliveryAdditionalInstructionText(String deliveryAdditionalInstructionText) {
this.deliveryAdditionalInstructionText = deliveryAdditionalInstructionText;
}
public Integer getGoodsDeliveredVendorDetailAssignedIdentifier() {
return goodsDeliveredVendorDetailAssignedIdentifier;
}
public void setGoodsDeliveredVendorDetailAssignedIdentifier(Integer goodsDeliveredVendorDetailAssignedIdentifier) {
this.goodsDeliveredVendorDetailAssignedIdentifier = goodsDeliveredVendorDetailAssignedIdentifier;
}
public Integer getGoodsDeliveredVendorHeaderGeneratedIdentifier() {
return goodsDeliveredVendorHeaderGeneratedIdentifier;
}
public void setGoodsDeliveredVendorHeaderGeneratedIdentifier(Integer goodsDeliveredVendorHeaderGeneratedIdentifier) {
this.goodsDeliveredVendorHeaderGeneratedIdentifier = goodsDeliveredVendorHeaderGeneratedIdentifier;
}
@Override
public boolean isBoNotesSupport() {
return true;
}
protected LinkedHashMap toStringMapper_RICE20_REFACTORME() {
LinkedHashMap m = new LinkedHashMap();
m.put("documentNumber", this.documentNumber);
m.put("PO", getPurchaseOrderIdentifier());
return m;
}
@Override
public String getWorkflowStatusForResult(){
return PurapSearchUtils.getWorkFlowStatusString(getDocumentHeader());
}
/**
* It's not needed to implement this method in this class since bulk receiving doesn't support items.
* Calling this method will throw an UnsupportedOperationException
* @throws UnsupportedOperationException
*/
@Override
public Class getItemClass() {
throw new UnsupportedOperationException("Items are not being handled in Bulk Receiving document");
}
/**
* It's not needed to implement PurapItemOperations methods in this class since bulk receiving doesn't support items.
* Calling this method will throw an UnsupportedOperationException
* @throws UnsupportedOperationException
*/
@Override
public <T> T getItem(int pos) {
throw new UnsupportedOperationException("Items are not being handled in Bulk Receiving document");
}
/**
* It's not needed to implement PurapItemOperations methods in this class since bulk receiving doesn't support items.
* Calling this method will throw an UnsupportedOperationException
* @throws UnsupportedOperationException
*/
@Override
public List getItems() {
throw new UnsupportedOperationException("Items are not being handled in Bulk Receiving document");
}
/**
* It's not needed to implement PurapItemOperations methods in this class since bulk receiving doesn't support items.
* Calling this method will throw an UnsupportedOperationException
* @throws UnsupportedOperationException
*/
@Override
public void setItems(List items) {
throw new UnsupportedOperationException("Items are not being handled in Bulk Receiving document");
}
}