/*
* 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.ar.businessobject;
import java.math.BigDecimal;
import java.util.LinkedHashMap;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.coa.businessobject.Account;
import org.kuali.kfs.coa.businessobject.ObjectCode;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.document.CustomerCreditMemoDocument;
import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDetailService;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* @author Kuali Nervous System Team (kualidev@oncourse.iu.edu)
*/
public class CustomerCreditMemoDetail extends PersistableBusinessObjectBase implements GeneralLedgerPendingEntrySourceDetail, AppliedPayment {
private String documentNumber;
private Integer referenceInvoiceItemNumber;
private BigDecimal creditMemoItemQuantity;
private KualiDecimal creditMemoItemTaxAmount;
private KualiDecimal creditMemoItemTotalAmount;
private KualiDecimal duplicateCreditMemoItemTotalAmount; // not in DB
private KualiDecimal invoiceLineTotalAmount; // not in DB
private KualiDecimal creditMemoLineTotalAmount; // not in DB
private KualiDecimal invoiceOpenItemAmount; // not in DB
private BigDecimal invoiceOpenItemQuantity; // not in DB
private CustomerInvoiceDetail customerInvoiceDetail; // not in DB
private String financialDocumentReferenceInvoiceNumber; // not in DB
private boolean invoiceOpenItemQuantityZero; // not in DB
/**
* Gets the documentNumber attribute.
*
* @return Returns the documentNumber
*/
@Override
public String getDocumentNumber() {
return documentNumber;
}
/**
* Sets the documentNumber attribute.
*
* @param documentNumber The documentNumber to set.
*/
public void setDocumentNumber(String documentNumber) {
this.documentNumber = documentNumber;
}
/**
* Gets the referenceInvoiceItemNumber attribute.
*
* @return Returns the referenceInvoiceItemNumber
*/
public Integer getReferenceInvoiceItemNumber() {
return referenceInvoiceItemNumber;
}
/**
* Sets the referenceInvoiceItemNumber attribute.
*
* @param referenceInvoiceItemNumber The referenceInvoiceItemNumber to set.
*/
public void setReferenceInvoiceItemNumber(Integer referenceInvoiceItemNumber) {
this.referenceInvoiceItemNumber = referenceInvoiceItemNumber;
}
/**
* Gets the creditMemoItemQuantity attribute.
*
* @return Returns the creditMemoItemQuantity
*/
public BigDecimal getCreditMemoItemQuantity() {
return creditMemoItemQuantity;
}
/**
* Sets the creditMemoItemQuantity attribute.
*
* @param creditMemoItemQuantity The creditMemoItemQuantity to set.
*/
public void setCreditMemoItemQuantity(BigDecimal creditMemoItemQuantity) {
this.creditMemoItemQuantity = creditMemoItemQuantity;
}
/**
* Gets the creditMemoItemTaxAmount attribute.
*
* @return Returns the creditMemoItemTaxAmount
*/
public KualiDecimal getCreditMemoItemTaxAmount() {
if (creditMemoItemTaxAmount == null) {
setCreditMemoItemTaxAmount(KualiDecimal.ZERO);
}
return creditMemoItemTaxAmount;
}
/**
* Sets the creditMemoItemTaxAmount attribute.
*
* @param creditMemoItemTaxAmount The creditMemoItemTaxAmount to set.
*/
public void setCreditMemoItemTaxAmount(KualiDecimal creditMemoItemTaxAmount) {
if (creditMemoItemTaxAmount == null) {
creditMemoItemTaxAmount = KualiDecimal.ZERO;
}
this.creditMemoItemTaxAmount = creditMemoItemTaxAmount;
}
/**
* Gets the creditMemoItemTotalAmount attribute.
*
* @return Returns the creditMemoItemTotalAmount
*/
public KualiDecimal getCreditMemoItemTotalAmount() {
return creditMemoItemTotalAmount;
}
/**
* Sets the creditMemoItemTotalAmount attribute.
*
* @param creditMemoItemTotalAmount The creditMemoItemTotalAmount to set.
*/
public void setCreditMemoItemTotalAmount(KualiDecimal creditMemoItemTotalAmount) {
this.creditMemoItemTotalAmount = creditMemoItemTotalAmount;
}
/**
* Gets the invoiceOpenItemAmount attribute.
*
* @return Returns the invoiceOpenItemAmount.
*/
public KualiDecimal getInvoiceOpenItemAmount() {
return invoiceOpenItemAmount;
}
/**
* Sets the invoiceOpenItemAmount attribute value.
*
* @param invoiceOpenItemAmount The invoiceOpenItemAmount to set.
*/
public void setInvoiceOpenItemAmount(KualiDecimal invoiceOpenItemAmount) {
this.invoiceOpenItemAmount = invoiceOpenItemAmount;
}
/**
* Gets the invoiceLineTotalAmount attribute.
*
* @return Returns the invoiceLineTotalAmount.
*/
public KualiDecimal getInvoiceLineTotalAmount() {
return invoiceLineTotalAmount;
}
/**
* Sets the invoiceLineTotalAmount attribute value.
*
* @param invoiceLineTotalAmount The invoiceLineTotalAmount to set.
*/
public void setInvoiceLineTotalAmount(KualiDecimal tax, KualiDecimal invItemAmount) {
if (invItemAmount == null) {
invItemAmount = KualiDecimal.ZERO;
}
if (tax == null) {
tax = KualiDecimal.ZERO;
}
this.invoiceLineTotalAmount = invItemAmount.add(tax);
}
/**
* Gets the creditMemoLineTotalAmount attribute.
*
* @return Returns the creditMemoLineTotalAmount.
*/
public KualiDecimal getCreditMemoLineTotalAmount() {
if (creditMemoLineTotalAmount == null) {
setCreditMemoLineTotalAmount(KualiDecimal.ZERO);
}
return creditMemoLineTotalAmount;
}
/**
* Sets the creditMemoLineTotalAmount attribute value.
*
* @param creditMemoLineTotalAmount The creditMemoLineTotalAmount to set.
*/
public void setCreditMemoLineTotalAmount(KualiDecimal creditMemoLineTotalAmount) {
this.creditMemoLineTotalAmount = creditMemoLineTotalAmount;
}
/**
* @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper()
*/
protected LinkedHashMap toStringMapper_RICE20_REFACTORME() {
LinkedHashMap m = new LinkedHashMap();
m.put("documentNumber", this.documentNumber);
if (this.referenceInvoiceItemNumber != null) {
m.put("referenceInvoiceItemNumber", this.referenceInvoiceItemNumber.toString());
}
return m;
}
public void setInvoiceLineTotalAmount(KualiDecimal invoiceLineTotalAmount) {
this.invoiceLineTotalAmount = invoiceLineTotalAmount;
}
public void recalculateBasedOnEnteredItemQty(CustomerCreditMemoDocument customerCreditMemoDocument) {
BigDecimal invItemUnitPrice = getCustomerInvoiceDetail().getInvoiceItemUnitPrice();
creditMemoItemTotalAmount = new KualiDecimal(creditMemoItemQuantity.multiply(invItemUnitPrice).setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR));
if (customerCreditMemoDocument.getArTaxService().isCustomerInvoiceDetailTaxable(customerCreditMemoDocument.getInvoice(), getCustomerInvoiceDetail())) {
creditMemoItemTaxAmount = customerCreditMemoDocument.getTaxService().getTotalSalesTaxAmount(customerCreditMemoDocument.getInvoice().getBillingDate(), customerCreditMemoDocument.getPostalCode(), creditMemoItemTotalAmount);
}
else {
creditMemoItemTaxAmount = KualiDecimal.ZERO;
}
creditMemoLineTotalAmount = creditMemoItemTotalAmount.add(creditMemoItemTaxAmount);
}
public void recalculateBasedOnEnteredItemAmount(CustomerCreditMemoDocument customerCreditMemoDocument) {
BigDecimal invItemUnitPrice = getCustomerInvoiceDetail().getInvoiceItemUnitPrice();
creditMemoItemQuantity = creditMemoItemTotalAmount.bigDecimalValue().divide(invItemUnitPrice, ArConstants.ITEM_QUANTITY_SCALE, BigDecimal.ROUND_HALF_UP);
if (customerCreditMemoDocument.getArTaxService().isCustomerInvoiceDetailTaxable(customerCreditMemoDocument.getInvoice(), getCustomerInvoiceDetail())) {
creditMemoItemTaxAmount = customerCreditMemoDocument.getTaxService().getTotalSalesTaxAmount(customerCreditMemoDocument.getInvoice().getBillingDate(), customerCreditMemoDocument.getPostalCode(), creditMemoItemTotalAmount);
}
else {
creditMemoItemTaxAmount = KualiDecimal.ZERO;
}
creditMemoLineTotalAmount = creditMemoItemTotalAmount.add(creditMemoItemTaxAmount);
}
/**
* Gets the duplicateCreditMemoItemTotalAmount attribute.
*
* @return Returns the duplicateCreditMemoItemTotalAmount.
*/
public KualiDecimal getDuplicateCreditMemoItemTotalAmount() {
return duplicateCreditMemoItemTotalAmount;
}
/**
* Sets the duplicateCreditMemoItemTotalAmount attribute value.
*
* @param duplicateCreditMemoItemTotalAmount The duplicateCreditMemoItemTotalAmount to set.
*/
public void setDuplicateCreditMemoItemTotalAmount(KualiDecimal duplicateCreditMemoItemTotalAmount) {
this.duplicateCreditMemoItemTotalAmount = duplicateCreditMemoItemTotalAmount;
}
/**
* Gets the invoiceOpenItemQuantity attribute.
*
* @return Returns the invoiceOpenItemQuantity.
*/
public BigDecimal getInvoiceOpenItemQuantity() {
return invoiceOpenItemQuantity;
}
/**
* Sets the invoiceOpenItemQuantity attribute value.
*
* @param invoiceOpenItemQuantity The invoiceOpenItemQuantity to set.
*/
public void setInvoiceOpenItemQuantity(BigDecimal invoiceOpenItemQuantity) {
this.invoiceOpenItemQuantity = invoiceOpenItemQuantity;
}
@Override
public String getChartOfAccountsCode() {
return getCustomerInvoiceDetail().getChartOfAccountsCode();
}
@Override
public String getAccountNumber() {
return getCustomerInvoiceDetail().getAccountNumber();
}
@Override
public Account getAccount() {
getCustomerInvoiceDetail().refreshReferenceObject(KFSPropertyConstants.ACCOUNT);
return getCustomerInvoiceDetail().getAccount();
}
@Override
public String getFinancialObjectCode() {
return getCustomerInvoiceDetail().getFinancialObjectCode();
}
@Override
public ObjectCode getObjectCode() {
getCustomerInvoiceDetail().refreshReferenceObject(KFSPropertyConstants.OBJECT_CODE);
return getCustomerInvoiceDetail().getObjectCode();
}
@Override
public String getOrganizationReferenceId() {
return getCustomerInvoiceDetail().getOrganizationReferenceId();
}
@Override
public String getProjectCode() {
return getCustomerInvoiceDetail().getProjectCode();
}
@Override
public String getReferenceNumber() {
return getCustomerInvoiceDetail().getReferenceNumber();
}
@Override
public String getReferenceTypeCode() {
return getCustomerInvoiceDetail().getReferenceTypeCode();
}
@Override
public String getReferenceOriginCode() {
return getCustomerInvoiceDetail().getReferenceOriginCode();
}
@Override
public String getSubAccountNumber() {
return getCustomerInvoiceDetail().getSubAccountNumber();
}
@Override
public String getFinancialSubObjectCode() {
return getCustomerInvoiceDetail().getFinancialSubObjectCode();
}
@Override
public String getFinancialDocumentLineDescription() {
return getCustomerInvoiceDetail().getFinancialDocumentLineDescription();
}
@Override
public KualiDecimal getAmount() {
return getCustomerInvoiceDetail().getAmount();
}
@Override
public Integer getPostingYear() {
return getCustomerInvoiceDetail().getPostingYear();
}
@Override
public String getBalanceTypeCode() {
return getCustomerInvoiceDetail().getBalanceTypeCode();
}
public ObjectCode getAccountsReceivableObject() {
return getCustomerInvoiceDetail().getAccountsReceivableObject();
}
public String getAccountsReceivableObjectCode() {
return getCustomerInvoiceDetail().getAccountsReceivableObjectCode();
}
public CustomerInvoiceDetail getCustomerInvoiceDetail() {
if (ObjectUtils.isNull(customerInvoiceDetail) && StringUtils.isNotEmpty(financialDocumentReferenceInvoiceNumber) && ObjectUtils.isNotNull(referenceInvoiceItemNumber)) {
customerInvoiceDetail = SpringContext.getBean(CustomerInvoiceDetailService.class).getCustomerInvoiceDetail(financialDocumentReferenceInvoiceNumber, referenceInvoiceItemNumber);
}
return customerInvoiceDetail;
}
/**
* Sets the customerInvoiceDetail attribute value.
*
* @param customerInvoiceDetail The customerInvoiceDetail to set.
*/
public void setCustomerInvoiceDetail(CustomerInvoiceDetail customerInvoiceDetail) {
this.customerInvoiceDetail = customerInvoiceDetail;
}
/**
* Gets the financialDocumentReferenceInvoiceNumber attribute.
*
* @return Returns the financialDocumentReferenceInvoiceNumber.
*/
public String getFinancialDocumentReferenceInvoiceNumber() {
return financialDocumentReferenceInvoiceNumber;
}
/**
* Sets the financialDocumentReferenceInvoiceNumber attribute value.
*
* @param financialDocumentReferenceInvoiceNumber The financialDocumentReferenceInvoiceNumber to set.
*/
public void setFinancialDocumentReferenceInvoiceNumber(String financialDocumentReferenceInvoiceNumber) {
this.financialDocumentReferenceInvoiceNumber = financialDocumentReferenceInvoiceNumber;
}
@Override
public Integer getInvoiceItemNumber() {
return referenceInvoiceItemNumber;
}
@Override
public String getInvoiceReferenceNumber() {
return financialDocumentReferenceInvoiceNumber;
}
public boolean isInvoiceOpenItemQuantityZero() {
return invoiceOpenItemQuantity.compareTo(BigDecimal.ZERO) == 0;
}
public void setInvoiceOpenItemQuantityZero(boolean invoiceOpenItemQuantityZero) {
this.invoiceOpenItemQuantityZero = invoiceOpenItemQuantityZero;
}
}