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 /* 017 * Created on Jul 12, 2004 018 * 019 */ 020 package org.kuali.kfs.pdp.businessobject; 021 022 import java.sql.Date; 023 import java.sql.Timestamp; 024 import java.text.ParseException; 025 import java.util.ArrayList; 026 import java.util.Calendar; 027 import java.util.LinkedHashMap; 028 import java.util.List; 029 030 import org.apache.commons.lang.StringUtils; 031 import org.kuali.kfs.pdp.PdpConstants; 032 import org.kuali.kfs.pdp.PdpParameterConstants; 033 import org.kuali.kfs.pdp.service.PaymentGroupService; 034 import org.kuali.kfs.sys.KFSConstants; 035 import org.kuali.kfs.sys.KFSPropertyConstants; 036 import org.kuali.kfs.sys.businessobject.TimestampedBusinessObjectBase; 037 import org.kuali.kfs.sys.context.SpringContext; 038 import org.kuali.rice.kns.service.DateTimeService; 039 import org.kuali.rice.kns.service.ParameterService; 040 import org.kuali.rice.kns.util.KualiDecimal; 041 import org.kuali.rice.kns.util.KualiInteger; 042 043 public class PaymentDetail extends TimestampedBusinessObjectBase { 044 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PaymentDetail.class); 045 private static KualiDecimal zero = KualiDecimal.ZERO; 046 047 private KualiInteger id; 048 private String invoiceNbr; 049 private Date invoiceDate; 050 private String purchaseOrderNbr; 051 private String custPaymentDocNbr; 052 private String financialSystemOriginCode; 053 private String financialDocumentTypeCode; 054 private String requisitionNbr; 055 private String organizationDocNbr; 056 private KualiDecimal origInvoiceAmount; 057 private KualiDecimal netPaymentAmount; 058 private KualiDecimal invTotDiscountAmount; 059 private KualiDecimal invTotShipAmount; 060 private KualiDecimal invTotOtherDebitAmount; 061 private KualiDecimal invTotOtherCreditAmount; 062 private Boolean primaryCancelledPayment; 063 064 private List<PaymentAccountDetail> accountDetail = new ArrayList<PaymentAccountDetail>(); 065 private List<PaymentNoteText> notes = new ArrayList<PaymentNoteText>(); 066 067 private KualiInteger paymentGroupId; 068 private PaymentGroup paymentGroup; 069 070 public PaymentDetail() { 071 super(); 072 } 073 074 public boolean isDetailAmountProvided() { 075 return (origInvoiceAmount != null) || (invTotDiscountAmount != null) || (invTotShipAmount != null) || (invTotOtherDebitAmount != null) || (invTotOtherCreditAmount != null); 076 } 077 078 public KualiDecimal getCalculatedPaymentAmount() { 079 KualiDecimal orig_invoice_amt = origInvoiceAmount == null ? zero : origInvoiceAmount; 080 KualiDecimal invoice_tot_discount_amt = invTotDiscountAmount == null ? zero : invTotDiscountAmount; 081 KualiDecimal invoice_tot_ship_amt = invTotShipAmount == null ? zero : invTotShipAmount; 082 KualiDecimal invoice_tot_other_debits = invTotOtherDebitAmount == null ? zero : invTotOtherDebitAmount; 083 KualiDecimal invoice_tot_other_credits = invTotOtherCreditAmount == null ? zero : invTotOtherCreditAmount; 084 085 KualiDecimal t = orig_invoice_amt.subtract(invoice_tot_discount_amt); 086 t = t.add(invoice_tot_ship_amt); 087 t = t.add(invoice_tot_other_debits); 088 t = t.subtract(invoice_tot_other_credits); 089 090 return t; 091 } 092 093 /** 094 * Determines if the disbursement date is past the number of days old (configured in system parameter) in which actions can take 095 * place 096 * 097 * @return true if actions are allowed on disbursement, false otherwise 098 */ 099 public boolean isDisbursementActionAllowed() { 100 if (paymentGroup.getDisbursementDate() == null) { 101 if (PdpConstants.PaymentStatusCodes.EXTRACTED.equals(paymentGroup.getPaymentStatus().getCode())) { 102 return false; 103 } 104 return true; 105 } 106 107 String daysStr = SpringContext.getBean(ParameterService.class).getParameterValue(PaymentDetail.class, PdpParameterConstants.DISBURSEMENT_CANCELLATION_DAYS); 108 int days = Integer.valueOf(daysStr); 109 110 Calendar c = Calendar.getInstance(); 111 c.add(Calendar.DATE, (days * -1)); 112 c.set(Calendar.HOUR, 12); 113 c.set(Calendar.MINUTE, 0); 114 c.set(Calendar.SECOND, 0); 115 c.set(Calendar.MILLISECOND, 0); 116 c.set(Calendar.AM_PM, Calendar.AM); 117 Timestamp lastDisbursementActionDate = new Timestamp(c.getTimeInMillis()); 118 119 Calendar c2 = Calendar.getInstance(); 120 c2.setTime(paymentGroup.getDisbursementDate()); 121 c2.set(Calendar.HOUR, 11); 122 c2.set(Calendar.MINUTE, 59); 123 c2.set(Calendar.SECOND, 59); 124 c2.set(Calendar.MILLISECOND, 59); 125 c2.set(Calendar.AM_PM, Calendar.PM); 126 Timestamp disbursementDate = new Timestamp(c2.getTimeInMillis()); 127 128 // date is equal to or after lastActionDate Allowed 129 return ((disbursementDate.compareTo(lastDisbursementActionDate)) >= 0); 130 } 131 132 /** 133 * @return total of all account detail amounts 134 */ 135 public KualiDecimal getAccountTotal() { 136 KualiDecimal acctTotal = new KualiDecimal(0.00); 137 138 for (PaymentAccountDetail paymentAccountDetail : accountDetail) { 139 if (paymentAccountDetail.getAccountNetAmount() != null) { 140 acctTotal = acctTotal.add(paymentAccountDetail.getAccountNetAmount()); 141 } 142 } 143 144 return acctTotal; 145 } 146 147 public Date getInvoiceDate() { 148 return invoiceDate; 149 } 150 151 public void setInvoiceDate(Date invoiceDate) { 152 this.invoiceDate = invoiceDate; 153 } 154 155 /** 156 * Takes a <code>String</code> and attempt to format as <code>Timestamp</code for setting the 157 * invoiceDate field 158 * 159 * @param invoiceDate Timestamp as string 160 */ 161 public void setInvoiceDate(String invoiceDate) throws ParseException { 162 this.invoiceDate = SpringContext.getBean(DateTimeService.class).convertToSqlDate(invoiceDate); 163 } 164 165 /** 166 * @hibernate.set name="accountDetail" 167 * @hibernate.collection-key column="pmt_dtl_id" 168 * @hibernate.collection-one-to-many class="edu.iu.uis.pdp.bo.PaymentAccountDetail" 169 */ 170 public List<PaymentAccountDetail> getAccountDetail() { 171 return accountDetail; 172 } 173 174 public void setAccountDetail(List<PaymentAccountDetail> ad) { 175 accountDetail = ad; 176 } 177 178 public void addAccountDetail(PaymentAccountDetail pad) { 179 pad.setPaymentDetail(this); 180 accountDetail.add(pad); 181 } 182 183 public void deleteAccountDetail(PaymentAccountDetail pad) { 184 accountDetail.remove(pad); 185 } 186 187 public List<PaymentNoteText> getNotes() { 188 return notes; 189 } 190 191 public void setNotes(List<PaymentNoteText> n) { 192 notes = n; 193 } 194 195 public void addNote(PaymentNoteText pnt) { 196 if (!StringUtils.isBlank(pnt.getCustomerNoteText())) { 197 pnt.setPaymentDetail(this); 198 notes.add(pnt); 199 } else { 200 LOG.warn("Did not add note to payment detail build from Document #: "+(!StringUtils.isBlank(custPaymentDocNbr) ? custPaymentDocNbr : "")+" because note was empty"); 201 } 202 } 203 204 /** 205 * Constructs a new <code>PaymentNoteText</code> for the given payment text and adds to the detail <code>List</code> 206 * 207 * @param paymentText note text 208 */ 209 public void addPaymentText(String paymentText) { 210 PaymentNoteText paymentNoteText = new PaymentNoteText(); 211 212 paymentNoteText.setCustomerNoteText(paymentText); 213 paymentNoteText.setCustomerNoteLineNbr(new KualiInteger(this.notes.size() + 1)); 214 215 addNote(paymentNoteText); 216 } 217 218 public void deleteNote(PaymentNoteText pnt) { 219 notes.remove(pnt); 220 } 221 222 /** 223 * @hibernate.id column="PMT_DTL_ID" generator-class="sequence" 224 * @hibernate.generator-param name="sequence" value="PDP.PDP_PMT_DTL_ID_SEQ" 225 * @return 226 */ 227 public KualiInteger getId() { 228 return id; 229 } 230 231 /** 232 * @return 233 * @hibernate.property column="CUST_PMT_DOC_NBR" length="9" 234 */ 235 public String getCustPaymentDocNbr() { 236 return custPaymentDocNbr; 237 } 238 239 /** 240 * @return 241 * @hibernate.property column="INV_NBR" length="14" 242 */ 243 public String getInvoiceNbr() { 244 return invoiceNbr; 245 } 246 247 /** 248 * @return 249 * @hibernate.property column="INV_TOT_DSCT_AMT" length="14" 250 */ 251 public KualiDecimal getInvTotDiscountAmount() { 252 return invTotDiscountAmount; 253 } 254 255 /** 256 * @return 257 * @hibernate.property column="INV_TOT_OTHR_CRDT_AMT" length="14" 258 */ 259 public KualiDecimal getInvTotOtherCreditAmount() { 260 return invTotOtherCreditAmount; 261 } 262 263 /** 264 * @return 265 * @hibernate.property column="INV_TOT_OTHR_DEBIT_AMT" length="14" 266 */ 267 public KualiDecimal getInvTotOtherDebitAmount() { 268 return invTotOtherDebitAmount; 269 } 270 271 /** 272 * @return 273 * @hibernate.property column="INV_TOT_SHP_AMT" length="14" 274 */ 275 public KualiDecimal getInvTotShipAmount() { 276 return invTotShipAmount; 277 } 278 279 /** 280 * @return 281 * @hibernate.property column="NET_PMT_AMT" length="14" 282 */ 283 public KualiDecimal getNetPaymentAmount() { 284 return netPaymentAmount; 285 } 286 287 /** 288 * @return 289 * @hibernate.property column="ORG_DOC_NBR" length="10" 290 */ 291 public String getOrganizationDocNbr() { 292 return organizationDocNbr; 293 } 294 295 /** 296 * @return 297 * @hibernate.property column="ORIG_INV_AMT" length="14" 298 */ 299 public KualiDecimal getOrigInvoiceAmount() { 300 return origInvoiceAmount; 301 } 302 303 /** 304 * @return 305 * @hibernate.property column="PO_NBR" length="9" 306 */ 307 public String getPurchaseOrderNbr() { 308 return purchaseOrderNbr; 309 } 310 311 /** 312 * @return 313 * @hibernate.property column="REQS_NBR" length=8" 314 */ 315 public String getRequisitionNbr() { 316 return requisitionNbr; 317 } 318 319 /** 320 * @return Returns the paymentGroup. 321 */ 322 public PaymentGroup getPaymentGroup() { 323 return paymentGroup; 324 } 325 326 /** 327 * @param string 328 */ 329 public void setCustPaymentDocNbr(String string) { 330 custPaymentDocNbr = string; 331 } 332 333 /** 334 * @param integer 335 */ 336 public void setId(KualiInteger integer) { 337 id = integer; 338 } 339 340 /** 341 * @param string 342 */ 343 public void setInvoiceNbr(String string) { 344 invoiceNbr = string; 345 } 346 347 /** 348 * @param decimal 349 */ 350 public void setInvTotDiscountAmount(KualiDecimal decimal) { 351 invTotDiscountAmount = decimal; 352 } 353 354 public void setInvTotDiscountAmount(String decimal) { 355 invTotDiscountAmount = new KualiDecimal(decimal); 356 } 357 358 /** 359 * @param decimal 360 */ 361 public void setInvTotOtherCreditAmount(KualiDecimal decimal) { 362 invTotOtherCreditAmount = decimal; 363 } 364 365 public void setInvTotOtherCreditAmount(String decimal) { 366 invTotOtherCreditAmount = new KualiDecimal(decimal); 367 } 368 369 /** 370 * @param decimal 371 */ 372 public void setInvTotOtherDebitAmount(KualiDecimal decimal) { 373 invTotOtherDebitAmount = decimal; 374 } 375 376 public void setInvTotOtherDebitAmount(String decimal) { 377 invTotOtherDebitAmount = new KualiDecimal(decimal); 378 } 379 380 /** 381 * @param decimal 382 */ 383 public void setInvTotShipAmount(KualiDecimal decimal) { 384 invTotShipAmount = decimal; 385 } 386 387 public void setInvTotShipAmount(String decimal) { 388 invTotShipAmount = new KualiDecimal(decimal); 389 } 390 391 /** 392 * @param decimal 393 */ 394 public void setNetPaymentAmount(KualiDecimal decimal) { 395 netPaymentAmount = decimal; 396 } 397 398 public void setNetPaymentAmount(String decimal) { 399 netPaymentAmount = new KualiDecimal(decimal); 400 } 401 402 /** 403 * @param string 404 */ 405 public void setOrganizationDocNbr(String string) { 406 organizationDocNbr = string; 407 } 408 409 /** 410 * @param decimal 411 */ 412 public void setOrigInvoiceAmount(KualiDecimal decimal) { 413 origInvoiceAmount = decimal; 414 } 415 416 public void setOrigInvoiceAmount(String decimal) { 417 origInvoiceAmount = new KualiDecimal(decimal); 418 } 419 420 /** 421 * @param string 422 */ 423 public void setPurchaseOrderNbr(String string) { 424 purchaseOrderNbr = string; 425 } 426 427 /** 428 * @param string 429 */ 430 public void setRequisitionNbr(String string) { 431 requisitionNbr = string; 432 } 433 434 /** 435 * @return Returns the financialDocumentTypeCode. 436 */ 437 public String getFinancialDocumentTypeCode() { 438 return financialDocumentTypeCode; 439 } 440 441 /** 442 * @param financialDocumentTypeCode The financialDocumentTypeCode to set. 443 */ 444 public void setFinancialDocumentTypeCode(String financialDocumentTypeCode) { 445 this.financialDocumentTypeCode = financialDocumentTypeCode; 446 } 447 448 /** 449 * @return Returns the primaryCancelledPayment. 450 */ 451 public Boolean getPrimaryCancelledPayment() { 452 return primaryCancelledPayment; 453 } 454 455 /** 456 * @param primaryCancelledPayment The primaryCancelledPayment to set. 457 */ 458 public void setPrimaryCancelledPayment(Boolean primaryCancelledPayment) { 459 this.primaryCancelledPayment = primaryCancelledPayment; 460 } 461 462 /** 463 * @param paymentGroup The paymentGroup to set. 464 */ 465 public void setPaymentGroup(PaymentGroup paymentGroup) { 466 this.paymentGroup = paymentGroup; 467 } 468 469 /** 470 * Gets the paymentGroupId attribute. 471 * 472 * @return Returns the paymentGroupId. 473 */ 474 public KualiInteger getPaymentGroupId() { 475 return paymentGroupId; 476 } 477 478 /** 479 * Sets the paymentGroupId attribute value. 480 * 481 * @param paymentGroupId The paymentGroupId to set. 482 */ 483 public void setPaymentGroupId(KualiInteger paymentGroupId) { 484 this.paymentGroupId = paymentGroupId; 485 } 486 487 /** 488 * Gets the financialSystemOriginCode attribute. 489 * 490 * @return Returns the financialSystemOriginCode. 491 */ 492 public String getFinancialSystemOriginCode() { 493 return financialSystemOriginCode; 494 } 495 496 /** 497 * Sets the financialSystemOriginCode attribute value. 498 * 499 * @param financialSystemOriginCode The financialSystemOriginCode to set. 500 */ 501 public void setFinancialSystemOriginCode(String financialSystemOriginCode) { 502 this.financialSystemOriginCode = financialSystemOriginCode; 503 } 504 505 /** 506 * This method returns a String representation of the payment detail notes 507 * 508 * @return the String representation of the payment detail notes 509 */ 510 public String getNotesText() { 511 StringBuffer notes = new StringBuffer(); 512 List<PaymentNoteText> notesList = getNotes(); 513 for (PaymentNoteText note : notesList) { 514 notes.append(note.getCustomerNoteText()); 515 notes.append(KFSConstants.NEWLINE); 516 } 517 return notes.toString(); 518 } 519 520 /** 521 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper() 522 */ 523 @Override 524 protected LinkedHashMap toStringMapper() { 525 LinkedHashMap m = new LinkedHashMap(); 526 527 m.put(KFSPropertyConstants.ID, this.id); 528 529 return m; 530 } 531 532 /** 533 * This method returns the number of payments in the payment group associated with this payment detail. 534 * 535 * @return the number of payments in the payment group 536 */ 537 public int getNbrOfPaymentsInPaymentGroup() { 538 return paymentGroup.getPaymentDetails().size(); 539 } 540 541 /** 542 * This method returns the number of payments in the disbursement associated with this payment detail. 543 * 544 * @return the number of payments in the disbursement 545 */ 546 public int getNbrOfPaymentsInDisbursement() { 547 List<PaymentGroup> paymentGroupList = SpringContext.getBean(PaymentGroupService.class).getByDisbursementNumber(paymentGroup.getDisbursementNbr().intValue()); 548 int nbrOfPaymentsInDisbursement = 0; 549 for (PaymentGroup paymentGroup : paymentGroupList) { 550 nbrOfPaymentsInDisbursement += paymentGroup.getPaymentDetails().size(); 551 } 552 return nbrOfPaymentsInDisbursement; 553 } 554 555 }