/*
* 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 static org.kuali.rice.core.api.util.type.KualiDecimal.ZERO;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.purap.PurapConstants;
import org.kuali.kfs.module.purap.PurapPropertyConstants;
import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
import org.kuali.kfs.module.purap.document.service.PurchaseOrderService;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.krad.service.SequenceAccessorService;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* Purchase Order Item Business Object.
*/
public class PurchaseOrderItem extends PurchasingItemBase {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurchaseOrderItem.class);
private String documentNumber;
private KualiDecimal itemInvoicedTotalQuantity;
private KualiDecimal itemInvoicedTotalAmount;
private KualiDecimal itemReceivedTotalQuantity;
private KualiDecimal itemOutstandingEncumberedQuantity;
private KualiDecimal itemOutstandingEncumberedAmount;
private boolean itemActiveIndicator = true;
private KualiDecimal itemDamagedTotalQuantity;
private PurchaseOrderDocument purchaseOrder;
// Not persisted to DB
private boolean itemSelectedForRetransmitIndicator;
private boolean movingToSplit;
/**
* Default constructor.
*/
public PurchaseOrderItem() {
}
/**
* Constructor.
*
* @param ri - Requisition Item
* @param po - Purchase Order Document
*/
public PurchaseOrderItem(RequisitionItem ri, PurchaseOrderDocument po, RequisitionCapitalAssetItem reqCamsItem) {
super();
this.setPurchaseOrder(po);
SequenceAccessorService sas = SpringContext.getBean(SequenceAccessorService.class);
Integer itemIdentifier = sas.getNextAvailableSequenceNumber("PO_ITM_ID", PurchaseOrderDocument.class).intValue();
this.setItemIdentifier(itemIdentifier);
this.setItemLineNumber(ri.getItemLineNumber());
this.setItemUnitOfMeasureCode(ri.getItemUnitOfMeasureCode());
this.setItemQuantity(ri.getItemQuantity());
this.setItemCatalogNumber(ri.getItemCatalogNumber());
this.setItemDescription(ri.getItemDescription());
this.setItemUnitPrice(ri.getItemUnitPrice());
this.setItemAuxiliaryPartIdentifier(ri.getItemAuxiliaryPartIdentifier());
this.setItemAssignedToTradeInIndicator(ri.getItemAssignedToTradeInIndicator());
this.setItemTaxAmount( ri.getItemTaxAmount() );
//copy use tax items over, and blank out keys (useTaxId and itemIdentifier)
for (PurApItemUseTax useTaxItem : ri.getUseTaxItems()) {
PurchaseOrderItemUseTax newItemUseTax = new PurchaseOrderItemUseTax(useTaxItem);
newItemUseTax.setItemIdentifier(itemIdentifier);
this.getUseTaxItems().add(newItemUseTax);
}
this.setExternalOrganizationB2bProductReferenceNumber(ri.getExternalOrganizationB2bProductReferenceNumber());
this.setExternalOrganizationB2bProductTypeName(ri.getExternalOrganizationB2bProductTypeName());
this.setItemReceivedTotalQuantity(ZERO);
this.setItemDamagedTotalQuantity(ZERO);
this.setItemTypeCode(ri.getItemTypeCode());
if (ri.getSourceAccountingLines() != null && ri.getSourceAccountingLines().size() > 0 &&
!StringUtils.equals(PurapConstants.ItemTypeCodes.ITEM_TYPE_ORDER_DISCOUNT_CODE,ri.getItemType().getItemTypeCode())) {
List accounts = new ArrayList();
for (PurApAccountingLine account : ri.getSourceAccountingLines()) {
PurchaseOrderAccount poAccount = new PurchaseOrderAccount(account);
poAccount.setPurchaseOrderItem(this);
accounts.add(poAccount);
}
this.setSourceAccountingLines(accounts);
}
// By default, set the item active indicator to true.
// In amendment, the user can set it to false when they click on
// the inactivate button.
this.setItemActiveIndicator(true);
this.setPurchasingCommodityCode(ri.getPurchasingCommodityCode());
this.setCommodityCode(getCommodityCode());
// If the RequisitionItem has a CapitalAssetItem, create a new PurchasingCapitalAssetItem and add it to the PO.
if( ObjectUtils.isNotNull(reqCamsItem) ) {
PurchaseOrderCapitalAssetItem newPOCapitalAssetItem = new PurchaseOrderCapitalAssetItem(reqCamsItem, itemIdentifier);
po.getPurchasingCapitalAssetItems().add(newPOCapitalAssetItem);
}
}
public boolean isItemActiveIndicator() {
return itemActiveIndicator;
}
// public String getItemActiveIndicator() {
// return (new Boolean(itemActiveIndicator)).toString();
// }
public void setItemActiveIndicator(boolean itemActiveIndicator) {
this.itemActiveIndicator = itemActiveIndicator;
}
public KualiDecimal getItemInvoicedTotalAmount() {
return itemInvoicedTotalAmount;
}
public void setItemInvoicedTotalAmount(KualiDecimal itemInvoicedTotalAmount) {
this.itemInvoicedTotalAmount = itemInvoicedTotalAmount;
}
public KualiDecimal getItemInvoicedTotalQuantity() {
return itemInvoicedTotalQuantity;
}
public void setItemInvoicedTotalQuantity(KualiDecimal itemInvoicedTotalQuantity) {
this.itemInvoicedTotalQuantity = itemInvoicedTotalQuantity;
}
public KualiDecimal getItemOutstandingEncumberedQuantity() {
return itemOutstandingEncumberedQuantity;
}
public void setItemOutstandingEncumberedQuantity(KualiDecimal itemOutstandingEncumberedQuantity) {
this.itemOutstandingEncumberedQuantity = itemOutstandingEncumberedQuantity;
}
public KualiDecimal getItemOutstandingEncumberedAmount() {
return itemOutstandingEncumberedAmount;
}
public void setItemOutstandingEncumberedAmount(KualiDecimal itemOutstandingEncumbranceAmount) {
this.itemOutstandingEncumberedAmount = itemOutstandingEncumbranceAmount;
}
public KualiDecimal getItemReceivedTotalQuantity() {
return itemReceivedTotalQuantity;
}
public void setItemReceivedTotalQuantity(KualiDecimal itemReceivedTotalQuantity) {
this.itemReceivedTotalQuantity = itemReceivedTotalQuantity;
}
/**
* Gets the itemDamagedTotalQuantity attribute.
* @return Returns the itemDamagedTotalQuantity.
*/
public KualiDecimal getItemDamagedTotalQuantity() {
return itemDamagedTotalQuantity;
}
/**
* Sets the itemDamagedTotalQuantity attribute value.
* @param itemDamagedTotalQuantity The itemDamagedTotalQuantity to set.
*/
public void setItemDamagedTotalQuantity(KualiDecimal itemDamagedTotalQuantity) {
this.itemDamagedTotalQuantity = itemDamagedTotalQuantity;
}
public PurchaseOrderDocument getPurchaseOrder() {
if (ObjectUtils.isNull(purchaseOrder)) {
refreshReferenceObject(PurapPropertyConstants.PURAP_DOC);
}
return super.getPurapDocument();
}
public void setPurchaseOrder(PurchaseOrderDocument purchaseOrder) {
setPurapDocument(purchaseOrder);
}
public String getDocumentNumber() {
return documentNumber;
}
public void setDocumentNumber(String documentNumber) {
this.documentNumber = documentNumber;
}
public boolean isItemSelectedForRetransmitIndicator() {
return itemSelectedForRetransmitIndicator;
}
public void setItemSelectedForRetransmitIndicator(boolean itemSelectedForRetransmitIndicator) {
this.itemSelectedForRetransmitIndicator = itemSelectedForRetransmitIndicator;
}
public boolean isMovingToSplit() {
return movingToSplit;
}
public void setMovingToSplit(boolean movingToSplit) {
this.movingToSplit = movingToSplit;
}
/**
* @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper()
*/
protected LinkedHashMap toStringMapper_RICE20_REFACTORME() {
LinkedHashMap m = new LinkedHashMap();
m.put("documentNumber", this.documentNumber);
if (this.getItemIdentifier() != null) {
m.put("itemIdentifier", this.getItemIdentifier().toString());
}
return m;
}
/**
* @see org.kuali.kfs.module.purap.businessobject.PurApItem#getAccountingLineClass()
*/
public Class getAccountingLineClass() {
return PurchaseOrderAccount.class;
}
/**
*
* This method returns the total item paid amount
* @return
*/
public KualiDecimal getItemPaidAmount() {
if (!(this.isItemActiveIndicator())) {
return KualiDecimal.ZERO;
}
return this.getItemInvoicedTotalAmount();
}
public KualiDecimal getItemEncumbranceRelievedAmount() {
// check that it is active else return zero
if (this == null || !this.isItemActiveIndicator()) {
return KualiDecimal.ZERO;
}
// setup outstanding amount and get totalEncumberance from this.getExtendedCost()
KualiDecimal outstandingAmount = KualiDecimal.ZERO;
KualiDecimal totalEncumberance = this.getTotalAmount();
ItemType iT = this.getItemType();
// if service add the po outstanding amount to outstanding amount
if (iT.isAmountBasedGeneralLedgerIndicator()) {
outstandingAmount = outstandingAmount.add(this.getItemOutstandingEncumberedAmount());
}
else {
// else add outstanding quantity * unit price
BigDecimal qty = new BigDecimal(this.getOutstandingQuantity().toString());
outstandingAmount = outstandingAmount.add(new KualiDecimal(this.getItemUnitPrice().multiply(qty).setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)));
KualiDecimal itemTaxAmount = this.getItemTaxAmount() == null ? ZERO : this.getItemTaxAmount();
KualiDecimal outstandingTaxAmount = new KualiDecimal(qty).divide(this.getItemQuantity()).multiply(itemTaxAmount);
outstandingAmount = outstandingAmount.add(outstandingTaxAmount);
}
// return the total encumbrance subtracted by the outstanding amount from above
return totalEncumberance.subtract(outstandingAmount);
}
/**
* Exists due to a setter requirement by the htmlControlAttribute
* @deprecated
* @param amount - outstanding quantity
*/
public void setOutstandingQuantity(){
// do nothing
}
public KualiDecimal getOutstandingQuantity() {
KualiDecimal outstandingQuantity = (this.getItemQuantity() != null) ? this.getItemQuantity() : KualiDecimal.ZERO;
KualiDecimal invoicedQuantity = (this.getItemInvoicedTotalQuantity() != null) ? this.getItemInvoicedTotalQuantity() : KualiDecimal.ZERO;
return outstandingQuantity.subtract(invoicedQuantity);
}
public boolean isCanInactivateItem() {
if (versionNumber == null) {
// don't allow newly added item to be inactivatable.
return false;
}
else if (versionNumber != null && itemActiveIndicator && !getPurchaseOrder().getContainsUnpaidPaymentRequestsOrCreditMemos()) {
return true;
}
return false;
}
/**
* Override the method in PurApItemBase so that if the item is
* not eligible to be displayed in the account summary tab,
* which is if the item is inactive, we'll return null and
* the item won't be added to the list of account summary.
*
* @see org.kuali.kfs.module.purap.businessobject.PurApItemBase#getSummaryItem()
*/
@Override
public PurApSummaryItem getSummaryItem() {
if (!this.itemActiveIndicator) {
return null;
}
else {
return super.getSummaryItem();
}
}
public boolean isNewUnorderedItem(){
return SpringContext.getBean(PurchaseOrderService.class).isNewUnorderedItem(this);
}
@Override
public boolean isNewItemForAmendment() {
return SpringContext.getBean(PurchaseOrderService.class).isNewItemForAmendment(this);
}
@Override
public Class getUseTaxClass() {
return PurchaseOrderItemUseTax.class;
}
}