/*
* 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.businessobject;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.purap.document.AccountsPayableDocumentBase;
import org.kuali.kfs.module.purap.document.LineItemReceivingDocument;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.exception.PurError;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* @author Kuali Nervous System Team (kualidev@oncourse.iu.edu)
*/
public class LineItemReceivingItem extends ReceivingItemBase {
private KualiDecimal itemOrderedQuantity;
// not stored in db
private KualiDecimal itemReceivedPriorQuantity;
private KualiDecimal itemReceivedToBeQuantity;
private LineItemReceivingDocument lineItemReceivingDocument;
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountsPayableDocumentBase.class);
/**
* Default constructor.
*/
public LineItemReceivingItem() {
}
public LineItemReceivingItem(LineItemReceivingDocument rld) {
this.setDocumentNumber(rld.getDocumentNumber());
this.setItemReceivedTotalQuantity(KualiDecimal.ZERO);
this.setItemReturnedTotalQuantity(KualiDecimal.ZERO);
this.setItemDamagedTotalQuantity(KualiDecimal.ZERO);
this.setItemOriginalReceivedTotalQuantity(KualiDecimal.ZERO);
this.setItemOriginalReturnedTotalQuantity(KualiDecimal.ZERO);
this.setItemOriginalDamagedTotalQuantity(KualiDecimal.ZERO);
}
public LineItemReceivingItem(PurchaseOrderItem poi, LineItemReceivingDocument rld) {
this.setDocumentNumber(rld.getDocumentNumber());
this.setItemTypeCode(poi.getItemTypeCode());
this.setPurchaseOrderIdentifier(rld.getPurchaseOrderIdentifier());
this.setItemLineNumber(poi.getItemLineNumber());
this.setItemCatalogNumber(poi.getItemCatalogNumber());
this.setItemDescription(poi.getItemDescription());
this.setItemOrderedQuantity(poi.getItemQuantity());
this.setItemUnitOfMeasureCode(poi.getItemUnitOfMeasureCode());
// TODO: Chris - look into this it appears this is null rather than zero on amendment, find out why!
if (ObjectUtils.isNull(poi.getItemReceivedTotalQuantity())) {
this.setItemReceivedPriorQuantity(KualiDecimal.ZERO);
}
else {
this.setItemReceivedPriorQuantity(poi.getItemReceivedTotalQuantity());
}
this.setItemReceivedToBeQuantity(this.getItemOrderedQuantity().subtract(this.getItemReceivedPriorQuantity()));
// should determine whether this is prefilled be based on the parameter that allows loading from po
this.setItemReceivedTotalQuantity(KualiDecimal.ZERO);
this.setItemReturnedTotalQuantity(KualiDecimal.ZERO);
this.setItemDamagedTotalQuantity(KualiDecimal.ZERO);
this.setItemOriginalReceivedTotalQuantity(KualiDecimal.ZERO);
this.setItemOriginalReturnedTotalQuantity(KualiDecimal.ZERO);
this.setItemOriginalDamagedTotalQuantity(KualiDecimal.ZERO);
// not added
this.setItemReasonAddedCode(null);
}
/**
* Retreives a purchase order item by inspecting the item type to see if its above the line or below the line and returns the
* appropriate type.
*
* @return - purchase order item
*/
public PurchaseOrderItem getPurchaseOrderItem() {
if (ObjectUtils.isNotNull(this.getLineItemReceivingDocument())) {
if (ObjectUtils.isNull(this.getLineItemReceivingDocument())) {
this.refreshReferenceObject("lineItemReceivingDocument");
}
}
// ideally we should do this a different way - maybe move it all into the service or save this info somehow (make sure and
// update though)
if (getLineItemReceivingDocument() != null) {
PurchaseOrderDocument po = getLineItemReceivingDocument().getPurchaseOrderDocument();
PurchaseOrderItem poi = null;
if (this.getItemType().isLineItemIndicator()) {
List<PurchaseOrderItem> items = po.getItems();
poi = items.get(this.getItemLineNumber().intValue() - 1);
// throw error if line numbers don't match
}
if (poi != null) {
return poi;
}
else {
// LOG.debug("getPurchaseOrderItem() Returning null because PurchaseOrderItem object for line number" +
// getItemLineNumber() + "or itemType " + getItemTypeCode() + " is null");
return null;
}
}
else {
LOG.error("getPurchaseOrderItem() Returning null because paymentRequest object is null");
throw new PurError("Receiving Line Object in Purchase Order item line number " + getItemLineNumber() + "or itemType " + getItemTypeCode() + " is null");
}
}
/**
* Gets the itemOrderedQuantity attribute.
*
* @return Returns the itemOrderedQuantity
*/
public KualiDecimal getItemOrderedQuantity() {
return itemOrderedQuantity;
}
/**
* Sets the itemOrderedQuantity attribute.
*
* @param itemOrderedQuantity The itemOrderedQuantity to set.
*/
public void setItemOrderedQuantity(KualiDecimal itemOrderedQuantity) {
this.itemOrderedQuantity = itemOrderedQuantity;
}
/**
* Gets the LineItemReceivingDocument attribute.
*
* @return Returns the LineItemReceivingDocument.
*/
public LineItemReceivingDocument getLineItemReceivingDocument() {
return lineItemReceivingDocument;
}
/**
* Sets the LineItemReceivingDocument attribute value.
*
* @param LineItemReceivingDocument The LineItemReceivingDocument to set.
* @deprecated
*/
public void setLineItemReceivingDocument(LineItemReceivingDocument lineItemReceivingDocument) {
this.lineItemReceivingDocument = lineItemReceivingDocument;
}
public KualiDecimal getItemReceivedPriorQuantity() {
if (ObjectUtils.isNull(itemReceivedPriorQuantity)) {
setItemReceivedPriorQuantity(getPurchaseOrderItem().getItemReceivedTotalQuantity());
}
return itemReceivedPriorQuantity;
}
public void setItemReceivedPriorQuantity(KualiDecimal itemReceivedPriorQuantity) {
this.itemReceivedPriorQuantity = itemReceivedPriorQuantity;
}
public KualiDecimal getItemReceivedToBeQuantity() {
// lazy loaded
KualiDecimal toBeQuantity = this.getItemOrderedQuantity().subtract(getItemReceivedPriorQuantity());
if (toBeQuantity.isNegative()) {
toBeQuantity = KualiDecimal.ZERO;
}
setItemReceivedToBeQuantity(toBeQuantity);
return itemReceivedToBeQuantity;
}
public void setItemReceivedToBeQuantity(KualiDecimal itemReceivedToBeQuantity) {
this.itemReceivedToBeQuantity = itemReceivedToBeQuantity;
}
public boolean isOrderedItem() {
return StringUtils.isEmpty(getItemReasonAddedCode());
}
}