1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.kuali.ole.module.purap.businessobject;
18
19 import org.kuali.ole.module.purap.PurapConstants;
20 import org.kuali.ole.module.purap.PurapPropertyConstants;
21 import org.kuali.ole.module.purap.document.InvoiceDocument;
22 import org.kuali.ole.module.purap.document.PurchaseOrderDocument;
23 import org.kuali.ole.module.purap.document.service.AccountsPayableService;
24 import org.kuali.ole.module.purap.document.service.PurapService;
25 import org.kuali.ole.module.purap.document.service.PurchaseOrderService;
26 import org.kuali.ole.module.purap.exception.PurError;
27 import org.kuali.ole.module.purap.util.ExpiredOrClosedAccountEntry;
28 import org.kuali.ole.module.purap.util.PurApItemUtils;
29 import org.kuali.ole.module.purap.util.PurApObjectUtils;
30 import org.kuali.ole.sys.context.SpringContext;
31 import org.kuali.rice.core.api.util.type.KualiDecimal;
32 import org.kuali.rice.krad.util.ObjectUtils;
33
34 import java.math.BigDecimal;
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.List;
38
39
40
41
42 public class InvoiceItem extends AccountsPayableItemBase {
43 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(InvoiceItem.class);
44
45 private BigDecimal purchaseOrderItemUnitPrice;
46 private KualiDecimal itemOutstandingInvoiceQuantity;
47 private KualiDecimal itemOutstandingInvoiceAmount;
48 private Integer invoiceIdentifier;
49 private Integer purchaseOrderIdentifier;
50 protected Integer accountsPayablePurchasingDocumentLinkIdentifier;
51 protected Integer poLineNumber;
52 protected boolean closePurchaseOrderIndicator;
53 protected boolean reopenPurchaseOrderIndicator;
54 protected Integer postingYear;
55 protected String recurringPaymentTypeCode;
56 protected RecurringPaymentType recurringPaymentType;
57 protected transient PurchaseOrderDocument purchaseOrderDocument;
58
59
60
61
62 public InvoiceItem() {
63
64 }
65
66
67
68
69
70
71
72 public InvoiceItem(PurchaseOrderItem poi, InvoiceDocument inv) {
73 this(poi, inv, new HashMap<String, ExpiredOrClosedAccountEntry>());
74 }
75
76
77
78
79
80
81
82
83 public InvoiceItem(PurchaseOrderItem poi, InvoiceDocument inv, HashMap<String, ExpiredOrClosedAccountEntry> expiredOrClosedAccountList) {
84
85
86 PurApObjectUtils.populateFromBaseClass(PurApItemBase.class, poi, this, PurapConstants.PREQ_ITEM_UNCOPYABLE_FIELDS);
87
88 setItemDescription(poi.getItemDescription());
89
90
91 resetAccount();
92
93
94 List accounts = new ArrayList();
95 for (PurApAccountingLine account : poi.getSourceAccountingLines()) {
96 PurchaseOrderAccount poa = (PurchaseOrderAccount) account;
97
98
99 SpringContext.getBean(AccountsPayableService.class).processExpiredOrClosedAccount(poa, expiredOrClosedAccountList);
100
101
102 if (poa.getAmount().isZero()) {
103 if (SpringContext.getBean(AccountsPayableService.class).canCopyAccountingLinesWithZeroAmount()) {
104 accounts.add(new InvoiceAccount(this, poa));
105 }
106 } else {
107 accounts.add(new InvoiceAccount(this, poa));
108 }
109 }
110
111 this.setSourceAccountingLines(accounts);
112 this.getUseTaxItems().clear();
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 if ((ObjectUtils.isNotNull(this.getItemType()) && this.getItemType().isAmountBasedGeneralLedgerIndicator())) {
129
130 this.setItemUnitPrice(null);
131 }
132
133
134 this.purchaseOrderItemUnitPrice = poi.getItemUnitPrice();
135
136
137
138 this.setPurapDocumentIdentifier(inv.getPurapDocumentIdentifier());
139 this.setPurapDocument(inv);
140 }
141
142
143
144
145
146
147
148 @Override
149 public PurchaseOrderItem getPurchaseOrderItem() {
150 if (ObjectUtils.isNotNull(this.getPurapDocumentIdentifier())) {
151 if (ObjectUtils.isNull(this.getInvoice())) {
152 this.refreshReferenceObject(PurapPropertyConstants.PURAP_DOC);
153 }
154 }
155
156
157 if (getInvoice() != null) {
158 PurchaseOrderDocument po = this.getInvoice().getPurchaseOrderDocument(this.getPurchaseOrderIdentifier());
159 this.setPostingYear(po.getPostingYear());
160 if (po.getRecurringPaymentType() != null) {
161 this.setRecurringPaymentType(po.getRecurringPaymentType());
162 this.setRecurringPaymentTypeCode(po.getRecurringPaymentTypeCode());
163 }
164 PurchaseOrderItem poi = null;
165 if (this.getItemType().isLineItemIndicator()) {
166 List<PurchaseOrderItem> items = po.getItems();
167 poi = items.get(this.getItemLineNumber().intValue() - 1);
168
169
170
171
172
173
174
175 } else {
176 poi = (PurchaseOrderItem) SpringContext.getBean(PurapService.class).getBelowTheLineByType(po, this.getItemType());
177 }
178 if (poi != null) {
179 return poi;
180 } else {
181 if (LOG.isDebugEnabled()) {
182 LOG.debug("getPurchaseOrderItem() Returning null because PurchaseOrderItem object for line number" + getItemLineNumber() + "or itemType " + getItemTypeCode() + " is null");
183 }
184 return null;
185 }
186 } else {
187
188 LOG.error("getPurchaseOrderItem() Returning null because invoice object is null");
189 throw new PurError("Payment Request Object in Purchase Order item line number " + getItemLineNumber() + "or itemType " + getItemTypeCode() + " is null");
190 }
191 }
192
193 public KualiDecimal getPoOutstandingAmount() {
194 PurchaseOrderItem poi = getPurchaseOrderItem();
195 if (ObjectUtils.isNull(this.getPurchaseOrderItemUnitPrice()) || KualiDecimal.ZERO.equals(this.getPurchaseOrderItemUnitPrice())) {
196 return null;
197 } else {
198 return this.getPoOutstandingAmount(poi);
199 }
200 }
201
202 private KualiDecimal getPoOutstandingAmount(PurchaseOrderItem poi) {
203 if (poi == null) {
204 return KualiDecimal.ZERO;
205 } else {
206 return poi.getItemOutstandingEncumberedAmount();
207 }
208 }
209
210 public KualiDecimal getPoOriginalAmount() {
211 PurchaseOrderItem poi = getPurchaseOrderItem();
212 if (poi == null) {
213 return null;
214 } else {
215 return poi.getExtendedPrice();
216 }
217 }
218
219
220
221
222
223
224
225 @Deprecated
226 public void setPoOutstandingAmount(KualiDecimal amount) {
227
228 }
229
230
231 public KualiDecimal getPoOutstandingQuantity() {
232 PurchaseOrderItem poi = getPurchaseOrderItem();
233 if (poi == null) {
234 return null;
235 } else {
236 if (PurapConstants.ItemTypeCodes.ITEM_TYPE_SERVICE_CODE.equals(this.getItemTypeCode())) {
237 return null;
238 } else {
239 return poi.getOutstandingQuantity();
240 }
241 }
242 }
243
244
245
246
247
248
249
250 @Deprecated
251 public void setPoOutstandingQuantity(KualiDecimal qty) {
252
253 }
254
255 public BigDecimal getPurchaseOrderItemUnitPrice() {
256 return purchaseOrderItemUnitPrice;
257 }
258
259 public Integer getAccountsPayablePurchasingDocumentLinkIdentifier() {
260 return accountsPayablePurchasingDocumentLinkIdentifier;
261 }
262
263 public void setAccountsPayablePurchasingDocumentLinkIdentifier(Integer accountsPayablePurchasingDocumentLinkIdentifier) {
264 this.accountsPayablePurchasingDocumentLinkIdentifier = accountsPayablePurchasingDocumentLinkIdentifier;
265 }
266
267 public Integer getPoLineNumber() {
268 return poLineNumber;
269 }
270
271 public void setPoLineNumber(Integer poLineNumber) {
272 this.poLineNumber = poLineNumber;
273 }
274
275
276 public Integer getPurchaseOrderIdentifier() {
277 return purchaseOrderIdentifier;
278 }
279
280 public void setPurchaseOrderIdentifier(Integer purchaseOrderIdentifier) {
281 this.purchaseOrderIdentifier = purchaseOrderIdentifier;
282 }
283
284 public Integer getInvoiceIdentifier() {
285 return invoiceIdentifier;
286 }
287
288 public void setInvoiceIdentifier(Integer invoiceIdentifier) {
289 this.invoiceIdentifier = invoiceIdentifier;
290 }
291
292 public BigDecimal getOriginalAmountfromPO() {
293 return purchaseOrderItemUnitPrice;
294 }
295
296 public void setOriginalAmountfromPO(BigDecimal purchaseOrderItemUnitPrice) {
297
298 }
299
300 public Integer getPostingYear() {
301 return postingYear;
302 }
303
304
305
306
307 public void setPostingYear(Integer postingYear) {
308 this.postingYear = postingYear;
309 }
310
311 public void setPurchaseOrderItemUnitPrice(BigDecimal purchaseOrderItemUnitPrice) {
312 this.purchaseOrderItemUnitPrice = purchaseOrderItemUnitPrice;
313 }
314
315 public KualiDecimal getItemOutstandingInvoiceAmount() {
316 return itemOutstandingInvoiceAmount;
317 }
318
319 public void setItemOutstandingInvoiceAmount(KualiDecimal itemOutstandingInvoiceAmount) {
320 this.itemOutstandingInvoiceAmount = itemOutstandingInvoiceAmount;
321 }
322
323 public KualiDecimal getItemOutstandingInvoiceQuantity() {
324 return itemOutstandingInvoiceQuantity;
325 }
326
327 public void setItemOutstandingInvoiceQuantity(KualiDecimal itemOutstandingInvoiceQuantity) {
328 this.itemOutstandingInvoiceQuantity = itemOutstandingInvoiceQuantity;
329 }
330
331 public InvoiceDocument getInvoice() {
332 if (ObjectUtils.isNotNull(getPurapDocumentIdentifier())) {
333 if (ObjectUtils.isNull(getPurapDocument())) {
334 this.refreshReferenceObject(PurapPropertyConstants.PURAP_DOC);
335 }
336 }
337 return super.getPurapDocument();
338 }
339
340 public void setInvoice(InvoiceDocument invoice) {
341 this.setPurapDocument(invoice);
342 }
343
344 public boolean isClosePurchaseOrderIndicator() {
345 return closePurchaseOrderIndicator;
346 }
347
348 public void setClosePurchaseOrderIndicator(boolean closePurchaseOrderIndicator) {
349 this.closePurchaseOrderIndicator = closePurchaseOrderIndicator;
350 }
351
352 public boolean isReopenPurchaseOrderIndicator() {
353 return reopenPurchaseOrderIndicator;
354 }
355
356 public void setReopenPurchaseOrderIndicator(boolean reopenPurchaseOrderIndicator) {
357 this.reopenPurchaseOrderIndicator = reopenPurchaseOrderIndicator;
358 }
359
360 public String getRecurringPaymentTypeCode() {
361 return recurringPaymentTypeCode;
362 }
363
364 public void setRecurringPaymentTypeCode(String recurringPaymentTypeCode) {
365 this.recurringPaymentTypeCode = recurringPaymentTypeCode;
366 }
367
368 public RecurringPaymentType getRecurringPaymentType() {
369 if (ObjectUtils.isNull(recurringPaymentType)) {
370 refreshReferenceObject(PurapPropertyConstants.RECURRING_PAYMENT_TYPE);
371 }
372 return recurringPaymentType;
373 }
374
375 public void setRecurringPaymentType(RecurringPaymentType recurringPaymentType) {
376 this.recurringPaymentType = recurringPaymentType;
377 }
378
379 public void generateAccountListFromPoItemAccounts(List<PurApAccountingLine> accounts) {
380 for (PurApAccountingLine line : accounts) {
381 PurchaseOrderAccount poa = (PurchaseOrderAccount) line;
382 if (!line.isEmpty()) {
383 getSourceAccountingLines().add(new InvoiceAccount(this, poa));
384 }
385 }
386 }
387
388
389
390
391 @Override
392 public Class getAccountingLineClass() {
393 return InvoiceAccount.class;
394 }
395
396 public boolean isDisplayOnPreq() {
397 PurchaseOrderItem poi = getPurchaseOrderItem();
398 if (ObjectUtils.isNull(poi)) {
399 LOG.debug("poi was null");
400 return false;
401 }
402
403
404 if (!poi.isItemActiveIndicator()) {
405 if (LOG.isDebugEnabled()) {
406 LOG.debug("poi was not active: " + poi.toString());
407 }
408 return false;
409 }
410
411 ItemType poiType = poi.getItemType();
412
413 if (poiType.isQuantityBasedGeneralLedgerIndicator()) {
414 if (poi.getItemQuantity().isGreaterThan(poi.getItemInvoicedTotalQuantity())) {
415 return true;
416 } else {
417 if (ObjectUtils.isNotNull(this.getItemQuantity()) && this.getItemQuantity().isGreaterThan(KualiDecimal.ZERO)) {
418 return true;
419 }
420 }
421
422 return false;
423 } else {
424 if (poi.getItemOutstandingEncumberedAmount().isGreaterThan(KualiDecimal.ZERO)) {
425 return true;
426 } else {
427 if (PurApItemUtils.isNonZeroExtended(this)) {
428 return true;
429 }
430 return false;
431 }
432
433 }
434 }
435
436
437
438
439
440
441 @Override
442 public void resetAccount() {
443 super.resetAccount();
444 this.getNewSourceLine().setAmount(null);
445 this.getNewSourceLine().setAccountLinePercent(null);
446 }
447
448
449
450
451 public void addToUnitPrice(BigDecimal addThisValue) {
452 if (getItemUnitPrice() == null) {
453 setItemUnitPrice(BigDecimal.ZERO);
454 }
455 BigDecimal addedPrice = getItemUnitPrice().add(addThisValue);
456 setItemUnitPrice(addedPrice);
457 }
458
459 public void addToExtendedPrice(KualiDecimal addThisValue) {
460 if (getExtendedPrice() == null) {
461 setExtendedPrice(KualiDecimal.ZERO);
462 }
463 KualiDecimal addedPrice = getExtendedPrice().add(addThisValue);
464 setExtendedPrice(addedPrice);
465 }
466
467 @Override
468 public Class getUseTaxClass() {
469 return InvoiceItemUseTax.class;
470 }
471
472
473
474
475 public PurchaseOrderDocument getPurchaseOrderDocument() {
476 if ((ObjectUtils.isNull(purchaseOrderDocument) || ObjectUtils.isNull(purchaseOrderDocument.getPurapDocumentIdentifier())) && (ObjectUtils.isNotNull(getPurchaseOrderIdentifier()))) {
477 setPurchaseOrderDocument(SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(this.getPurchaseOrderIdentifier()));
478 }
479 return purchaseOrderDocument;
480 }
481
482
483
484
485 public void setPurchaseOrderDocument(PurchaseOrderDocument purchaseOrderDocument) {
486 if (ObjectUtils.isNull(purchaseOrderDocument)) {
487
488
489 this.purchaseOrderDocument = null;
490 } else {
491 if (ObjectUtils.isNotNull(purchaseOrderDocument.getPurapDocumentIdentifier())) {
492 setPurchaseOrderIdentifier(purchaseOrderDocument.getPurapDocumentIdentifier());
493 }
494 this.purchaseOrderDocument = purchaseOrderDocument;
495 }
496 }
497
498
499 }