001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.module.purap.businessobject;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.kfs.module.purap.document.AccountsPayableDocumentBase;
020 import org.kuali.kfs.module.purap.document.LineItemReceivingDocument;
021 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
022 import org.kuali.kfs.module.purap.exception.PurError;
023 import org.kuali.rice.kns.util.KualiDecimal;
024 import org.kuali.rice.kns.util.ObjectUtils;
025
026 /**
027 * @author Kuali Nervous System Team (kualidev@oncourse.iu.edu)
028 */
029 public class LineItemReceivingItem extends ReceivingItemBase {
030
031 private KualiDecimal itemOrderedQuantity;
032
033 // not stored in db
034 private KualiDecimal itemReceivedPriorQuantity;
035 private KualiDecimal itemReceivedToBeQuantity;
036
037 private LineItemReceivingDocument lineItemReceivingDocument;
038
039 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountsPayableDocumentBase.class);
040
041 /**
042 * Default constructor.
043 */
044 public LineItemReceivingItem() {
045 }
046
047 public LineItemReceivingItem(LineItemReceivingDocument rld) {
048 this.setDocumentNumber(rld.getDocumentNumber());
049 this.setItemReceivedTotalQuantity(KualiDecimal.ZERO);
050 this.setItemReturnedTotalQuantity(KualiDecimal.ZERO);
051 this.setItemDamagedTotalQuantity(KualiDecimal.ZERO);
052 this.setItemOriginalReceivedTotalQuantity(KualiDecimal.ZERO);
053 this.setItemOriginalReturnedTotalQuantity(KualiDecimal.ZERO);
054 this.setItemOriginalDamagedTotalQuantity(KualiDecimal.ZERO);
055 }
056
057 public LineItemReceivingItem(PurchaseOrderItem poi, LineItemReceivingDocument rld) {
058
059 this.setDocumentNumber(rld.getDocumentNumber());
060 this.setItemTypeCode(poi.getItemTypeCode());
061
062 this.setItemLineNumber(poi.getItemLineNumber());
063 this.setItemCatalogNumber(poi.getItemCatalogNumber());
064 this.setItemDescription(poi.getItemDescription());
065
066 this.setItemOrderedQuantity(poi.getItemQuantity());
067 this.setItemUnitOfMeasureCode(poi.getItemUnitOfMeasureCode());
068
069 // TODO: Chris - look into this it appears this is null rather than zero on amendment, find out why!
070 if (ObjectUtils.isNull(poi.getItemReceivedTotalQuantity())) {
071 this.setItemReceivedPriorQuantity(KualiDecimal.ZERO);
072 }
073 else {
074 this.setItemReceivedPriorQuantity(poi.getItemReceivedTotalQuantity());
075 }
076
077 this.setItemReceivedToBeQuantity(this.getItemOrderedQuantity().subtract(this.getItemReceivedPriorQuantity()));
078
079 // should determine whether this is prefilled be based on the parameter that allows loading from po
080 this.setItemReceivedTotalQuantity(KualiDecimal.ZERO);
081
082 this.setItemReturnedTotalQuantity(KualiDecimal.ZERO);
083 this.setItemDamagedTotalQuantity(KualiDecimal.ZERO);
084
085 this.setItemOriginalReceivedTotalQuantity(KualiDecimal.ZERO);
086 this.setItemOriginalReturnedTotalQuantity(KualiDecimal.ZERO);
087 this.setItemOriginalDamagedTotalQuantity(KualiDecimal.ZERO);
088
089 // not added
090 this.setItemReasonAddedCode(null);
091 }
092
093 /**
094 * Retreives a purchase order item by inspecting the item type to see if its above the line or below the line and returns the
095 * appropriate type.
096 *
097 * @return - purchase order item
098 */
099 public PurchaseOrderItem getPurchaseOrderItem() {
100 if (ObjectUtils.isNotNull(this.getLineItemReceivingDocument())) {
101 if (ObjectUtils.isNull(this.getLineItemReceivingDocument())) {
102 this.refreshReferenceObject("lineItemReceivingDocument");
103 }
104 }
105 // ideally we should do this a different way - maybe move it all into the service or save this info somehow (make sure and
106 // update though)
107 if (getLineItemReceivingDocument() != null) {
108 PurchaseOrderDocument po = getLineItemReceivingDocument().getPurchaseOrderDocument();
109 PurchaseOrderItem poi = null;
110 if (this.getItemType().isLineItemIndicator()) {
111 poi = (PurchaseOrderItem) po.getItem(this.getItemLineNumber().intValue() - 1);
112 // throw error if line numbers don't match
113 }
114 if (poi != null) {
115 return poi;
116 }
117 else {
118 // LOG.debug("getPurchaseOrderItem() Returning null because PurchaseOrderItem object for line number" +
119 // getItemLineNumber() + "or itemType " + getItemTypeCode() + " is null");
120 return null;
121 }
122 }
123 else {
124 LOG.error("getPurchaseOrderItem() Returning null because paymentRequest object is null");
125 throw new PurError("Receiving Line Object in Purchase Order item line number " + getItemLineNumber() + "or itemType " + getItemTypeCode() + " is null");
126 }
127 }
128
129 /**
130 * Gets the itemOrderedQuantity attribute.
131 *
132 * @return Returns the itemOrderedQuantity
133 */
134 public KualiDecimal getItemOrderedQuantity() {
135 return itemOrderedQuantity;
136 }
137
138 /**
139 * Sets the itemOrderedQuantity attribute.
140 *
141 * @param itemOrderedQuantity The itemOrderedQuantity to set.
142 */
143 public void setItemOrderedQuantity(KualiDecimal itemOrderedQuantity) {
144 this.itemOrderedQuantity = itemOrderedQuantity;
145 }
146
147 /**
148 * Gets the LineItemReceivingDocument attribute.
149 *
150 * @return Returns the LineItemReceivingDocument.
151 */
152 public LineItemReceivingDocument getLineItemReceivingDocument() {
153 return lineItemReceivingDocument;
154 }
155
156 /**
157 * Sets the LineItemReceivingDocument attribute value.
158 *
159 * @param LineItemReceivingDocument The LineItemReceivingDocument to set.
160 * @deprecated
161 */
162 public void setLineItemReceivingDocument(LineItemReceivingDocument lineItemReceivingDocument) {
163 this.lineItemReceivingDocument = lineItemReceivingDocument;
164 }
165
166 public KualiDecimal getItemReceivedPriorQuantity() {
167 if (ObjectUtils.isNull(itemReceivedPriorQuantity)) {
168 setItemReceivedPriorQuantity(getPurchaseOrderItem().getItemReceivedTotalQuantity());
169 }
170 return itemReceivedPriorQuantity;
171 }
172
173 public void setItemReceivedPriorQuantity(KualiDecimal itemReceivedPriorQuantity) {
174
175 this.itemReceivedPriorQuantity = itemReceivedPriorQuantity;
176 }
177
178 public KualiDecimal getItemReceivedToBeQuantity() {
179 // lazy loaded
180 KualiDecimal toBeQuantity = this.getItemOrderedQuantity().subtract(getItemReceivedPriorQuantity());
181 if (toBeQuantity.isNegative()) {
182 toBeQuantity = KualiDecimal.ZERO;
183 }
184 setItemReceivedToBeQuantity(toBeQuantity);
185
186 return itemReceivedToBeQuantity;
187 }
188
189 public void setItemReceivedToBeQuantity(KualiDecimal itemReceivedToBeQuantity) {
190 this.itemReceivedToBeQuantity = itemReceivedToBeQuantity;
191 }
192
193 public boolean isOrderedItem() {
194 return StringUtils.isEmpty(getItemReasonAddedCode());
195 }
196
197 }