/* * 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/>. */ /* * Created on Jul 12, 2004 * */ package org.kuali.kfs.pdp.businessobject; import java.sql.Date; import java.sql.Timestamp; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.LinkedHashMap; import java.util.List; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.pdp.PdpConstants; import org.kuali.kfs.pdp.PdpParameterConstants; import org.kuali.kfs.pdp.service.PaymentGroupService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.TimestampedBusinessObjectBase; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.core.api.util.type.KualiInteger; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.krad.util.ObjectUtils; public class PaymentDetail extends TimestampedBusinessObjectBase { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PaymentDetail.class); private static KualiDecimal zero = KualiDecimal.ZERO; private KualiInteger id; private String invoiceNbr; private Date invoiceDate; private String purchaseOrderNbr; private String custPaymentDocNbr; private String financialSystemOriginCode; private String financialDocumentTypeCode; private String requisitionNbr; private String organizationDocNbr; private String customerInstitutionNumber; private KualiDecimal origInvoiceAmount; private KualiDecimal netPaymentAmount; private KualiDecimal invTotDiscountAmount; private KualiDecimal invTotShipAmount; private KualiDecimal invTotOtherDebitAmount; private KualiDecimal invTotOtherCreditAmount; private Boolean primaryCancelledPayment; private List<PaymentAccountDetail> accountDetail = new ArrayList<PaymentAccountDetail>(); private List<PaymentNoteText> notes = new ArrayList<PaymentNoteText>(); private KualiInteger paymentGroupId; private PaymentGroup paymentGroup; public PaymentDetail() { super(); } public boolean isDetailAmountProvided() { return (origInvoiceAmount != null) || (invTotDiscountAmount != null) || (invTotShipAmount != null) || (invTotOtherDebitAmount != null) || (invTotOtherCreditAmount != null); } public KualiDecimal getCalculatedPaymentAmount() { KualiDecimal orig_invoice_amt = origInvoiceAmount == null ? zero : origInvoiceAmount; KualiDecimal invoice_tot_discount_amt = invTotDiscountAmount == null ? zero : invTotDiscountAmount; KualiDecimal invoice_tot_ship_amt = invTotShipAmount == null ? zero : invTotShipAmount; KualiDecimal invoice_tot_other_debits = invTotOtherDebitAmount == null ? zero : invTotOtherDebitAmount; KualiDecimal invoice_tot_other_credits = invTotOtherCreditAmount == null ? zero : invTotOtherCreditAmount; KualiDecimal t = orig_invoice_amt.subtract(invoice_tot_discount_amt); t = t.add(invoice_tot_ship_amt); t = t.add(invoice_tot_other_debits); t = t.subtract(invoice_tot_other_credits); return t; } /** * Determines if the disbursement date is past the number of days old (configured in system parameter) in which actions can take * place * * @return true if actions are allowed on disbursement, false otherwise */ public boolean isDisbursementActionAllowed() { if (paymentGroup.getDisbursementDate() == null) { if (PdpConstants.PaymentStatusCodes.EXTRACTED.equals(paymentGroup.getPaymentStatus().getCode())) { return false; } return true; } String daysStr = SpringContext.getBean(ParameterService.class).getParameterValueAsString(PaymentDetail.class, PdpParameterConstants.DISBURSEMENT_CANCELLATION_DAYS); int days = Integer.valueOf(daysStr); Calendar c = Calendar.getInstance(); c.add(Calendar.DATE, (days * -1)); c.set(Calendar.HOUR, 12); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); c.set(Calendar.AM_PM, Calendar.AM); Timestamp lastDisbursementActionDate = new Timestamp(c.getTimeInMillis()); Calendar c2 = Calendar.getInstance(); c2.setTime(paymentGroup.getDisbursementDate()); c2.set(Calendar.HOUR, 11); c2.set(Calendar.MINUTE, 59); c2.set(Calendar.SECOND, 59); c2.set(Calendar.MILLISECOND, 59); c2.set(Calendar.AM_PM, Calendar.PM); Timestamp disbursementDate = new Timestamp(c2.getTimeInMillis()); // date is equal to or after lastActionDate Allowed return ((disbursementDate.compareTo(lastDisbursementActionDate)) >= 0); } /** * @return total of all account detail amounts */ public KualiDecimal getAccountTotal() { KualiDecimal acctTotal = new KualiDecimal(0.00); for (PaymentAccountDetail paymentAccountDetail : accountDetail) { if (paymentAccountDetail.getAccountNetAmount() != null) { acctTotal = acctTotal.add(paymentAccountDetail.getAccountNetAmount()); } } return acctTotal; } public Date getInvoiceDate() { return invoiceDate; } public void setInvoiceDate(Date invoiceDate) { this.invoiceDate = invoiceDate; } /** * Takes a <code>String</code> and attempt to format as <code>Timestamp</code for setting the * invoiceDate field * * @param invoiceDate Timestamp as string */ public void setInvoiceDate(String invoiceDate) throws ParseException { this.invoiceDate = SpringContext.getBean(DateTimeService.class).convertToSqlDate(invoiceDate); } /** * @hibernate.set name="accountDetail" * @hibernate.collection-key column="pmt_dtl_id" * @hibernate.collection-one-to-many class="edu.iu.uis.pdp.bo.PaymentAccountDetail" */ public List<PaymentAccountDetail> getAccountDetail() { return accountDetail; } public void setAccountDetail(List<PaymentAccountDetail> ad) { accountDetail = ad; } public void addAccountDetail(PaymentAccountDetail pad) { pad.setPaymentDetail(this); accountDetail.add(pad); } public void deleteAccountDetail(PaymentAccountDetail pad) { accountDetail.remove(pad); } public List<PaymentNoteText> getNotes() { return notes; } public void setNotes(List<PaymentNoteText> n) { notes = n; } public void addNote(PaymentNoteText pnt) { if (!StringUtils.isBlank(pnt.getCustomerNoteText())) { pnt.setPaymentDetail(this); notes.add(pnt); } else { LOG.warn("Did not add note to payment detail build from Document #: "+(!StringUtils.isBlank(custPaymentDocNbr) ? custPaymentDocNbr : "")+" because note was empty"); } } /** * Constructs a new <code>PaymentNoteText</code> for the given payment text and adds to the detail <code>List</code> * * @param paymentText note text */ public void addPaymentText(String paymentText) { PaymentNoteText paymentNoteText = new PaymentNoteText(); paymentNoteText.setCustomerNoteText(paymentText); paymentNoteText.setCustomerNoteLineNbr(new KualiInteger(this.notes.size() + 1)); addNote(paymentNoteText); } public void deleteNote(PaymentNoteText pnt) { notes.remove(pnt); } /** * @hibernate.id column="PMT_DTL_ID" generator-class="sequence" * @hibernate.generator-param name="sequence" value="PDP.PDP_PMT_DTL_ID_SEQ" * @return */ public KualiInteger getId() { return id; } /** * @return * @hibernate.property column="CUST_PMT_DOC_NBR" length="9" */ public String getCustPaymentDocNbr() { return custPaymentDocNbr; } /** * @return * @hibernate.property column="INV_NBR" length="14" */ public String getInvoiceNbr() { return invoiceNbr; } /** * @return * @hibernate.property column="INV_TOT_DSCT_AMT" length="14" */ public KualiDecimal getInvTotDiscountAmount() { return invTotDiscountAmount; } /** * @return * @hibernate.property column="INV_TOT_OTHR_CRDT_AMT" length="14" */ public KualiDecimal getInvTotOtherCreditAmount() { return invTotOtherCreditAmount; } /** * @return * @hibernate.property column="INV_TOT_OTHR_DEBIT_AMT" length="14" */ public KualiDecimal getInvTotOtherDebitAmount() { return invTotOtherDebitAmount; } /** * @return * @hibernate.property column="INV_TOT_SHP_AMT" length="14" */ public KualiDecimal getInvTotShipAmount() { return invTotShipAmount; } /** * @return * @hibernate.property column="NET_PMT_AMT" length="14" */ public KualiDecimal getNetPaymentAmount() { return netPaymentAmount; } /** * @return * @hibernate.property column="ORG_DOC_NBR" length="10" */ public String getOrganizationDocNbr() { return organizationDocNbr; } /** * @return * @hibernate.property column="ORIG_INV_AMT" length="14" */ public KualiDecimal getOrigInvoiceAmount() { return origInvoiceAmount; } /** * @return * @hibernate.property column="PO_NBR" length="9" */ public String getPurchaseOrderNbr() { return purchaseOrderNbr; } /** * @return * @hibernate.property column="REQS_NBR" length=8" */ public String getRequisitionNbr() { return requisitionNbr; } /** * @return Returns the paymentGroup. */ public PaymentGroup getPaymentGroup() { return paymentGroup; } /** * @param string */ public void setCustPaymentDocNbr(String string) { custPaymentDocNbr = string; } /** * @param integer */ public void setId(KualiInteger integer) { id = integer; } /** * @param string */ public void setInvoiceNbr(String string) { invoiceNbr = string; } /** * @param decimal */ public void setInvTotDiscountAmount(KualiDecimal decimal) { invTotDiscountAmount = decimal; } public void setInvTotDiscountAmount(String decimal) { invTotDiscountAmount = new KualiDecimal(decimal); } /** * @param decimal */ public void setInvTotOtherCreditAmount(KualiDecimal decimal) { invTotOtherCreditAmount = decimal; } public void setInvTotOtherCreditAmount(String decimal) { invTotOtherCreditAmount = new KualiDecimal(decimal); } /** * @param decimal */ public void setInvTotOtherDebitAmount(KualiDecimal decimal) { invTotOtherDebitAmount = decimal; } public void setInvTotOtherDebitAmount(String decimal) { invTotOtherDebitAmount = new KualiDecimal(decimal); } /** * @param decimal */ public void setInvTotShipAmount(KualiDecimal decimal) { invTotShipAmount = decimal; } public void setInvTotShipAmount(String decimal) { invTotShipAmount = new KualiDecimal(decimal); } /** * @param decimal */ public void setNetPaymentAmount(KualiDecimal decimal) { netPaymentAmount = decimal; } public void setNetPaymentAmount(String decimal) { netPaymentAmount = new KualiDecimal(decimal); } /** * @param string */ public void setOrganizationDocNbr(String string) { organizationDocNbr = string; } /** * @param decimal */ public void setOrigInvoiceAmount(KualiDecimal decimal) { origInvoiceAmount = decimal; } public void setOrigInvoiceAmount(String decimal) { origInvoiceAmount = new KualiDecimal(decimal); } /** * @param string */ public void setPurchaseOrderNbr(String string) { purchaseOrderNbr = string; } /** * @param string */ public void setRequisitionNbr(String string) { requisitionNbr = string; } /** * @return Returns the financialDocumentTypeCode. */ public String getFinancialDocumentTypeCode() { return financialDocumentTypeCode; } /** * @param financialDocumentTypeCode The financialDocumentTypeCode to set. */ public void setFinancialDocumentTypeCode(String financialDocumentTypeCode) { this.financialDocumentTypeCode = financialDocumentTypeCode; } /** * @return Returns the primaryCancelledPayment. */ public Boolean getPrimaryCancelledPayment() { return primaryCancelledPayment; } /** * @param primaryCancelledPayment The primaryCancelledPayment to set. */ public void setPrimaryCancelledPayment(Boolean primaryCancelledPayment) { this.primaryCancelledPayment = primaryCancelledPayment; } /** * @param paymentGroup The paymentGroup to set. */ public void setPaymentGroup(PaymentGroup paymentGroup) { this.paymentGroup = paymentGroup; } /** * Gets the paymentGroupId attribute. * * @return Returns the paymentGroupId. */ public KualiInteger getPaymentGroupId() { return paymentGroupId; } /** * Sets the paymentGroupId attribute value. * * @param paymentGroupId The paymentGroupId to set. */ public void setPaymentGroupId(KualiInteger paymentGroupId) { this.paymentGroupId = paymentGroupId; } /** * Gets the financialSystemOriginCode attribute. * * @return Returns the financialSystemOriginCode. */ public String getFinancialSystemOriginCode() { return financialSystemOriginCode; } /** * Sets the financialSystemOriginCode attribute value. * * @param financialSystemOriginCode The financialSystemOriginCode to set. */ public void setFinancialSystemOriginCode(String financialSystemOriginCode) { this.financialSystemOriginCode = financialSystemOriginCode; } /** * @return the customerInstitutionNumber */ public String getCustomerInstitutionNumber() { return customerInstitutionNumber; } /** * @param customerInstitutionNumber the customerInstitutionNumber to set */ public void setCustomerInstitutionNumber(String customerInstitutionNumber) { this.customerInstitutionNumber = customerInstitutionNumber; } /** * This method returns a String representation of the payment detail notes * * @return the String representation of the payment detail notes */ public String getNotesText() { StringBuffer notes = new StringBuffer(); List<PaymentNoteText> notesList = getNotes(); for (PaymentNoteText note : notesList) { notes.append(note.getCustomerNoteText()); notes.append(KFSConstants.NEWLINE); } return notes.toString(); } /** * @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper() */ protected LinkedHashMap toStringMapper_RICE20_REFACTORME() { LinkedHashMap m = new LinkedHashMap(); m.put(KFSPropertyConstants.ID, this.id); return m; } /** * This method returns the number of payments in the payment group associated with this payment detail. * * @return the number of payments in the payment group */ public int getNbrOfPaymentsInPaymentGroup() { return paymentGroup.getPaymentDetails().size(); } /** * This method returns the number of payments in the disbursement associated with this payment detail. * * @return the number of payments in the disbursement */ public int getNbrOfPaymentsInDisbursement() { int nbrOfPaymentsInDisbursement = 0; if (ObjectUtils.isNotNull((paymentGroup.getDisbursementNbr()))) { List<PaymentGroup> paymentGroupList = SpringContext.getBean(PaymentGroupService.class).getByDisbursementNumber(paymentGroup.getDisbursementNbr().intValue()); for (PaymentGroup paymentGroup : paymentGroupList) { nbrOfPaymentsInDisbursement += paymentGroup.getPaymentDetails().size(); } } return nbrOfPaymentsInDisbursement; } }