/*
* 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.vnd.businessobject;
import java.lang.reflect.Field;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.log4j.Logger;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.krad.bo.BusinessObject;
import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
import org.kuali.rice.krad.datadictionary.AttributeSecurity;
import org.kuali.rice.krad.service.DataDictionaryService;
import org.kuali.rice.krad.service.KualiModuleService;
import org.kuali.rice.krad.service.ModuleService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.kuali.rice.location.api.LocationConstants;
import org.kuali.rice.location.framework.country.CountryEbo;
/**
* Contains information specific to a parent Vendor, which may be shared by its division Vendors if it has any. Contained by a
* <code>VendorDetail</code>.
*
* @see org.kuali.kfs.vnd.businessobject.VendorDetail
*/
public class VendorHeader extends PersistableBusinessObjectBase {
private static Logger LOG = Logger.getLogger(VendorHeader.class);
private Integer vendorHeaderGeneratedIdentifier;
private String vendorTypeCode;
private String vendorTaxNumber;
private String vendorTaxTypeCode;
private String vendorOwnershipCode;
private String vendorOwnershipCategoryCode;
private Date vendorFederalWithholdingTaxBeginningDate;
private Date vendorFederalWithholdingTaxEndDate;
private Boolean vendorW9ReceivedIndicator;
private Boolean vendorW8BenReceivedIndicator;
private Boolean vendorDebarredIndicator;
private Boolean vendorForeignIndicator;
private String vendorW8TypeCode;
private Date vendorW8SignedDate;
private Date vendorW9SignedDate;
private String vendorCorpCitizenCode;
private String vendorForeignTaxId;
private String vendorGIIN;
private Date vendorDOB;
private String vendorChapter3StatusCode;
private String vendorChapter4StatusCode;
private VendorType vendorType;
private OwnershipType vendorOwnership;
private OwnershipCategory vendorOwnershipCategory;
private W8Type w8Type;
private Chapter3Status chapter3Status;
private Chapter4Status chapter4Status;
private List<VendorSupplierDiversity> vendorSupplierDiversities;
private List<VendorTaxChange> vendorTaxChanges;
protected CountryEbo vendorCountry;
/**
* Default constructor.
*/
public VendorHeader() {
vendorSupplierDiversities = new ArrayList<VendorSupplierDiversity>();
}
public Integer getVendorHeaderGeneratedIdentifier() {
return vendorHeaderGeneratedIdentifier;
}
public void setVendorHeaderGeneratedIdentifier(Integer vendorHeaderGeneratedIdentifier) {
this.vendorHeaderGeneratedIdentifier = vendorHeaderGeneratedIdentifier;
}
public String getVendorTypeCode() {
return vendorTypeCode;
}
public void setVendorTypeCode(String vendorTypeCode) {
this.vendorTypeCode = vendorTypeCode;
}
public String getVendorTaxNumber() {
return vendorTaxNumber;
}
public void setVendorTaxNumber(String vendorTaxNumber) {
this.vendorTaxNumber = vendorTaxNumber;
}
public String getVendorTaxTypeCode() {
return vendorTaxTypeCode;
}
public void setVendorTaxTypeCode(String vendorTaxTypeCode) {
this.vendorTaxTypeCode = vendorTaxTypeCode;
}
public String getVendorOwnershipCode() {
return vendorOwnershipCode;
}
public void setVendorOwnershipCode(String vendorOwnershipCode) {
this.vendorOwnershipCode = vendorOwnershipCode;
}
public String getVendorOwnershipCategoryCode() {
return vendorOwnershipCategoryCode;
}
public void setVendorOwnershipCategoryCode(String vendorOwnershipCategoryCode) {
this.vendorOwnershipCategoryCode = vendorOwnershipCategoryCode;
}
public Date getVendorFederalWithholdingTaxBeginningDate() {
return vendorFederalWithholdingTaxBeginningDate;
}
public void setVendorFederalWithholdingTaxBeginningDate(Date vendorFederalWithholdingTaxBeginningDate) {
this.vendorFederalWithholdingTaxBeginningDate = vendorFederalWithholdingTaxBeginningDate;
}
public Date getVendorFederalWithholdingTaxEndDate() {
return vendorFederalWithholdingTaxEndDate;
}
public void setVendorFederalWithholdingTaxEndDate(Date vendorFederalWithholdingTaxEndDate) {
this.vendorFederalWithholdingTaxEndDate = vendorFederalWithholdingTaxEndDate;
}
public Boolean getVendorW9ReceivedIndicator() {
return vendorW9ReceivedIndicator;
}
public void setVendorW9ReceivedIndicator(Boolean vendorW9ReceivedIndicator) {
this.vendorW9ReceivedIndicator = vendorW9ReceivedIndicator;
}
public Boolean getVendorW8BenReceivedIndicator() {
return vendorW8BenReceivedIndicator;
}
public void setVendorW8BenReceivedIndicator(Boolean vendorW8BenReceivedIndicator) {
this.vendorW8BenReceivedIndicator = vendorW8BenReceivedIndicator;
}
public VendorType getVendorType() {
// refresh because proxy doesn't work properly and vendor type sometimes is null
if (vendorType == null) {
this.refreshReferenceObject("vendorType");
}
return vendorType;
}
/**
* Sets the vendorType attribute.
*
* @param vendorType The vendorType to set.
* @deprecated
*/
@Deprecated
public void setVendorType(VendorType vendorType) {
this.vendorType = vendorType;
}
public OwnershipType getVendorOwnership() {
return vendorOwnership;
}
/**
* Sets the vendorOwnership attribute.
*
* @param vendorOwnership The vendorOwnership to set.
* @deprecated
*/
@Deprecated
public void setVendorOwnership(OwnershipType vendorOwnership) {
this.vendorOwnership = vendorOwnership;
}
public OwnershipCategory getVendorOwnershipCategory() {
return vendorOwnershipCategory;
}
/**
* Sets the vendorOwnershipCategory attribute.
*
* @param vendorOwnershipCategory The vendorOwnershipCategory to set.
* @deprecated
*/
@Deprecated
public void setVendorOwnershipCategory(OwnershipCategory vendorOwnershipCategory) {
this.vendorOwnershipCategory = vendorOwnershipCategory;
}
public Boolean getVendorDebarredIndicator() {
return vendorDebarredIndicator;
}
/**
* Sets the vendorDebarredIndicator attribute value.
*
* @param vendorDebarredIndicator The vendorDebarredIndicator to set.
*/
public void setVendorDebarredIndicator(Boolean vendorDebarredIndicator) {
this.vendorDebarredIndicator = vendorDebarredIndicator;
}
public Boolean getVendorForeignIndicator() {
return vendorForeignIndicator;
}
/**
* Sets the vendorForeignIndicator attribute value.
*
* @param vendorForeignIndicator The vendorForeignIndicator to set.
*/
public void setVendorForeignIndicator(Boolean vendorForeignIndicator) {
this.vendorForeignIndicator = vendorForeignIndicator;
}
public List<VendorSupplierDiversity> getVendorSupplierDiversities() {
return vendorSupplierDiversities;
}
public void setVendorSupplierDiversities(List<VendorSupplierDiversity> vendorSupplierDiversities) {
this.vendorSupplierDiversities = vendorSupplierDiversities;
}
/**
* Gets the vendorW8SignedDate attribute.
*
* @return Returns the vendorW8SignedDate
*/
public Date getVendorW8SignedDate() {
return vendorW8SignedDate;
}
/**
* Sets the vendorW8SignedDate attribute.
*
* @param vendorW8SignedDate The vendorW8SignedDate to set.
*/
public void setVendorW8SignedDate(Date vendorW8SignedDate) {
this.vendorW8SignedDate = vendorW8SignedDate;
}
/**
* Gets the vendorW9SignedDate attribute.
*
* @return Returns the vendorW9SignedDate
*/
public Date getVendorW9SignedDate() {
return vendorW9SignedDate;
}
/**
* Sets the vendorW9SignedDate attribute.
*
* @param vendorW9SignedDate The vendorW9SignedDate to set.
*/
public void setVendorW9SignedDate(Date vendorW9SignedDate) {
this.vendorW9SignedDate = vendorW9SignedDate;
}
/**
* Gets the vendorCorpCitizenCode attribute.
*
* @return Returns the vendorCorpCitizenCode
*/
public String getVendorCorpCitizenCode() {
return vendorCorpCitizenCode;
}
/**
* Gets the vendorW8TypeCode attribute.
*
* @return Returns the vendorW8TypeCode
*/
public String getVendorW8TypeCode() {
return vendorW8TypeCode;
}
/**
* Sets the vendorW8TypeCode attribute.
*
* @param vendorW8TypeCode The vendorW8TypeCode to set.
*/
public void setVendorW8TypeCode(String vendorW8TypeCode) {
this.vendorW8TypeCode = vendorW8TypeCode;
}
/**
* Sets the vendorCorpCitizenCode attribute.
*
* @param vendorCorpCitizenCode The vendorCorpCitizenCode to set.
*/
public void setVendorCorpCitizenCode(String vendorCorpCitizenCode) {
this.vendorCorpCitizenCode = vendorCorpCitizenCode;
}
/**
* Gets the vendorForeignTaxId attribute.
*
* @return Returns the vendorForeignTaxId
*/
public String getVendorForeignTaxId() {
return vendorForeignTaxId;
}
/**
* Sets the vendorForeignTaxId attribute.
*
* @param vendorForeignTaxId The vendorForeignTaxId to set.
*/
public void setVendorForeignTaxId(String vendorForeignTaxId) {
this.vendorForeignTaxId = vendorForeignTaxId;
}
/**
* Gets the vendorGIIN attribute.
*
* @return Returns the vendorGIIN
*/
public String getVendorGIIN() {
return vendorGIIN;
}
/**
* Sets the vendorGIIN attribute.
*
* @param vendorGIIN The vendorGIIN to set.
*/
public void setVendorGIIN(String vendorGIIN) {
this.vendorGIIN = vendorGIIN;
}
/**
* Gets the vendorDOB attribute.
*
* @return Returns the vendorDOB
*/
public Date getVendorDOB() {
return vendorDOB;
}
/**
* Sets the vendorDOB attribute.
*
* @param vendorDOB The vendorDOB to set.
*/
public void setVendorDOB(Date vendorDOB) {
this.vendorDOB = vendorDOB;
}
/**
* Gets the vendorChapter3StatusCode attribute.
*
* @return Returns the vendorChapter3StatusCode
*/
public String getVendorChapter3StatusCode() {
return vendorChapter3StatusCode;
}
/**
* Sets the vendorChapter3StatusCode attribute.
*
* @param vendorChapter3StatusCode The vendorChapter3StatusCode to set.
*/
public void setVendorChapter3StatusCode(String vendorChapter3StatusCode) {
this.vendorChapter3StatusCode = vendorChapter3StatusCode;
}
/**
* Gets the vendorChapter4StatusCode attribute.
*
* @return Returns the vendorChapter4StatusCode
*/
public String getVendorChapter4StatusCode() {
return vendorChapter4StatusCode;
}
/**
* Sets the vendorChapter4StatusCode attribute.
*
* @param vendorChapter4StatusCode The vendorChapter4StatusCode to set.
*/
public void setVendorChapter4StatusCode(String vendorChapter4StatusCode) {
this.vendorChapter4StatusCode = vendorChapter4StatusCode;
}
/**
* Gets the w8Type attribute.
*
* @return Returns the w8Type
*/
public W8Type getW8Type() {
return w8Type;
}
/**
* Sets the w8Type attribute.
*
* @param w8Type The w8Type to set.
*/
public void setW8Type(W8Type w8Type) {
this.w8Type = w8Type;
}
/**
* Gets the chapter3Status attribute.
*
* @return Returns the chapter3Status
*/
public Chapter3Status getChapter3Status() {
return chapter3Status;
}
/**
* Sets the chapter3Status attribute.
*
* @param chapter3Status The chapter3Status to set.
*/
public void setChapter3Status(Chapter3Status chapter3Status) {
this.chapter3Status = chapter3Status;
}
/**
* Gets the chapter4Status attribute.
*
* @return Returns the chapter4Status
*/
public Chapter4Status getChapter4Status() {
return chapter4Status;
}
/**
* Sets the chapter4Status attribute.
*
* @param chapter4Status The chapter4Status to set.
*/
public void setChapter4Status(Chapter4Status chapter4Status) {
this.chapter4Status = chapter4Status;
}
public CountryEbo getVendorCountry() {
if ( StringUtils.isBlank(vendorCorpCitizenCode) ) {
vendorCountry = null;
} else {
if ( vendorCountry == null || !StringUtils.equals( vendorCountry.getCode(),vendorCorpCitizenCode) ) {
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, vendorCorpCitizenCode);
vendorCountry = moduleService.getExternalizableBusinessObject(CountryEbo.class, keys);
} else {
throw new RuntimeException( "CONFIGURATION ERROR: No responsible module found for EBO class. Unable to proceed." );
}
}
}
return vendorCountry;
}
/**
* Sets the vendorCountry attribute.
*
* @param vendorCountry The vendorCountry to set.
* @deprecated
*/
@Deprecated
public void setVendorCountry(CountryEbo vendorCountry) {
this.vendorCountry = vendorCountry;
}
/**
* Used by the Spring Framework to correctly retrieve the vendor supplier diversities as a single
* attribute. The vendorSupplierDiversities is a collection of diversities, and without this method,
* there was no way to get a single attribute for it.
*
* @return the vendor supplier diversities as a single attribute
*/
public String getVendorSupplierDiversitiesAsString() {
StringBuilder sb = new StringBuilder("vendorSupplierDiversities=[");
boolean first = true;
for (VendorSupplierDiversity vsd : vendorSupplierDiversities) {
if(vsd.isActive()){
if (!first) {
sb.append(", ");
} else {
first = false;
}
sb.append(vsd.getVendorSupplierDiversity().getVendorSupplierDiversityDescription().toString());
}
}
sb.append(']');
return sb.toString();
}
public List<VendorTaxChange> getVendorTaxChanges() {
return vendorTaxChanges;
}
public void setVendorTaxChanges(List<VendorTaxChange> vendorTaxChanges) {
this.vendorTaxChanges = vendorTaxChanges;
}
/**
* This method is a predicate to test equality of all the persisted attributes of an instance of this class, including member
* collections. This is used to determine whether to route
*
* @param vh Another VendorHeader object
* @return True if all non-derived attributes of the given object are equal to this one's
*/
public boolean isEqualForRouting(VendorHeader vh) {
LOG.debug("Entering isEqualForRouting.");
return new EqualsBuilder()
.append(getVendorTypeCode(), vh.getVendorTypeCode())
.append(getVendorTaxNumber(), vh.getVendorTaxNumber())
.append(getVendorOwnershipCode(), vh.getVendorOwnershipCode())
.append(getVendorOwnershipCategoryCode(), vh.getVendorOwnershipCategoryCode())
.append(getVendorFederalWithholdingTaxBeginningDate(), vh.getVendorFederalWithholdingTaxBeginningDate())
.append(getVendorFederalWithholdingTaxEndDate(), vh.getVendorFederalWithholdingTaxEndDate())
.append(getVendorW9ReceivedIndicator(), vh.getVendorW9ReceivedIndicator())
.append(getVendorW8BenReceivedIndicator(), vh.getVendorW8BenReceivedIndicator())
.append(getVendorDebarredIndicator(), vh.getVendorDebarredIndicator())
.append(getVendorForeignIndicator(), vh.getVendorForeignIndicator())
.isEquals();
}
@Override
public String toString() {
class VendorHeaderToStringBuilder extends ReflectionToStringBuilder {
private VendorHeaderToStringBuilder(Object object) {
super(object);
}
@Override
public boolean accept(Field field) {
if (BusinessObject.class.isAssignableFrom(field.getType())) {
return false;
}
DataDictionaryService dataDictionaryService = SpringContext.getBean(DataDictionaryService.class);
AttributeSecurity attributeSecurity = dataDictionaryService.getAttributeSecurity(VendorHeader.class.getName(), field.getName());
if (ObjectUtils.isNotNull(attributeSecurity)
&& (attributeSecurity.isHide() || attributeSecurity.isMask() || attributeSecurity.isPartialMask())) {
return false;
}
return super.accept(field);
}
};
ReflectionToStringBuilder toStringBuilder = new VendorHeaderToStringBuilder(this);
return toStringBuilder.toString();
}
}