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.ar.businessobject; 017 018 import java.math.BigDecimal; 019 import java.math.MathContext; 020 import java.util.LinkedHashMap; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.kuali.kfs.coa.businessobject.Account; 024 import org.kuali.kfs.coa.businessobject.ObjectCode; 025 import org.kuali.kfs.module.ar.document.CustomerCreditMemoDocument; 026 import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDetailService; 027 import org.kuali.kfs.sys.KFSPropertyConstants; 028 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; 029 import org.kuali.kfs.sys.context.SpringContext; 030 import org.kuali.rice.kns.bo.PersistableBusinessObjectBase; 031 import org.kuali.rice.kns.util.KualiDecimal; 032 import org.kuali.rice.kns.util.ObjectUtils; 033 034 /** 035 * @author Kuali Nervous System Team (kualidev@oncourse.iu.edu) 036 */ 037 038 public class CustomerCreditMemoDetail extends PersistableBusinessObjectBase implements GeneralLedgerPendingEntrySourceDetail, AppliedPayment { 039 040 private String documentNumber; 041 private Integer referenceInvoiceItemNumber; 042 private BigDecimal creditMemoItemQuantity; 043 private KualiDecimal creditMemoItemTaxAmount; 044 private KualiDecimal creditMemoItemTotalAmount; 045 private KualiDecimal duplicateCreditMemoItemTotalAmount; // not in DB 046 private KualiDecimal invoiceLineTotalAmount; // not in DB 047 private KualiDecimal creditMemoLineTotalAmount; // not in DB 048 private KualiDecimal invoiceOpenItemAmount; // not in DB 049 private KualiDecimal invoiceOpenItemQuantity; // not in DB 050 private CustomerInvoiceDetail customerInvoiceDetail; // not in DB 051 private String financialDocumentReferenceInvoiceNumber; // not in DB 052 private boolean invoiceOpenItemQuantityZero; // not in DB 053 054 /** 055 * Default constructor. 056 */ 057 public CustomerCreditMemoDetail() { 058 059 } 060 061 /** 062 * Gets the documentNumber attribute. 063 * 064 * @return Returns the documentNumber 065 */ 066 public String getDocumentNumber() { 067 return documentNumber; 068 } 069 070 /** 071 * Sets the documentNumber attribute. 072 * 073 * @param documentNumber The documentNumber to set. 074 */ 075 public void setDocumentNumber(String documentNumber) { 076 this.documentNumber = documentNumber; 077 } 078 079 080 /** 081 * Gets the referenceInvoiceItemNumber attribute. 082 * 083 * @return Returns the referenceInvoiceItemNumber 084 */ 085 public Integer getReferenceInvoiceItemNumber() { 086 return referenceInvoiceItemNumber; 087 } 088 089 /** 090 * Sets the referenceInvoiceItemNumber attribute. 091 * 092 * @param referenceInvoiceItemNumber The referenceInvoiceItemNumber to set. 093 */ 094 public void setReferenceInvoiceItemNumber(Integer referenceInvoiceItemNumber) { 095 this.referenceInvoiceItemNumber = referenceInvoiceItemNumber; 096 } 097 098 099 /** 100 * Gets the creditMemoItemQuantity attribute. 101 * 102 * @return Returns the creditMemoItemQuantity 103 */ 104 public BigDecimal getCreditMemoItemQuantity() { 105 return creditMemoItemQuantity; 106 } 107 108 /** 109 * Sets the creditMemoItemQuantity attribute. 110 * 111 * @param creditMemoItemQuantity The creditMemoItemQuantity to set. 112 */ 113 public void setCreditMemoItemQuantity(BigDecimal creditMemoItemQuantity) { 114 this.creditMemoItemQuantity = creditMemoItemQuantity; 115 } 116 117 118 /** 119 * Gets the creditMemoItemTaxAmount attribute. 120 * 121 * @return Returns the creditMemoItemTaxAmount 122 */ 123 public KualiDecimal getCreditMemoItemTaxAmount() { 124 if (creditMemoItemTaxAmount == null) 125 setCreditMemoItemTaxAmount(KualiDecimal.ZERO); 126 return creditMemoItemTaxAmount; 127 } 128 129 /** 130 * Sets the creditMemoItemTaxAmount attribute. 131 * 132 * @param creditMemoItemTaxAmount The creditMemoItemTaxAmount to set. 133 */ 134 public void setCreditMemoItemTaxAmount(KualiDecimal creditMemoItemTaxAmount) { 135 if (creditMemoItemTaxAmount == null) 136 creditMemoItemTaxAmount = KualiDecimal.ZERO; 137 this.creditMemoItemTaxAmount = creditMemoItemTaxAmount; 138 } 139 140 141 /** 142 * Gets the creditMemoItemTotalAmount attribute. 143 * 144 * @return Returns the creditMemoItemTotalAmount 145 */ 146 public KualiDecimal getCreditMemoItemTotalAmount() { 147 return creditMemoItemTotalAmount; 148 } 149 150 /** 151 * Sets the creditMemoItemTotalAmount attribute. 152 * 153 * @param creditMemoItemTotalAmount The creditMemoItemTotalAmount to set. 154 */ 155 public void setCreditMemoItemTotalAmount(KualiDecimal creditMemoItemTotalAmount) { 156 this.creditMemoItemTotalAmount = creditMemoItemTotalAmount; 157 } 158 159 /** 160 * Gets the invoiceOpenItemAmount attribute. 161 * 162 * @return Returns the invoiceOpenItemAmount. 163 */ 164 public KualiDecimal getInvoiceOpenItemAmount() { 165 return invoiceOpenItemAmount; 166 } 167 168 /** 169 * Sets the invoiceOpenItemAmount attribute value. 170 * 171 * @param invoiceOpenItemAmount The invoiceOpenItemAmount to set. 172 */ 173 public void setInvoiceOpenItemAmount(KualiDecimal invoiceOpenItemAmount) { 174 this.invoiceOpenItemAmount = invoiceOpenItemAmount; 175 } 176 177 /** 178 * Gets the invoiceLineTotalAmount attribute. 179 * 180 * @return Returns the invoiceLineTotalAmount. 181 */ 182 public KualiDecimal getInvoiceLineTotalAmount() { 183 return invoiceLineTotalAmount; 184 } 185 186 /** 187 * Sets the invoiceLineTotalAmount attribute value. 188 * 189 * @param invoiceLineTotalAmount The invoiceLineTotalAmount to set. 190 */ 191 public void setInvoiceLineTotalAmount(KualiDecimal tax, KualiDecimal invItemAmount) { 192 if (invItemAmount == null) 193 invItemAmount = KualiDecimal.ZERO; 194 if (tax == null) 195 tax = KualiDecimal.ZERO; 196 197 this.invoiceLineTotalAmount = invItemAmount.add(tax); 198 } 199 200 /** 201 * Gets the creditMemoLineTotalAmount attribute. 202 * 203 * @return Returns the creditMemoLineTotalAmount. 204 */ 205 public KualiDecimal getCreditMemoLineTotalAmount() { 206 if (creditMemoLineTotalAmount == null) 207 setCreditMemoLineTotalAmount(KualiDecimal.ZERO); 208 return creditMemoLineTotalAmount; 209 } 210 211 /** 212 * Sets the creditMemoLineTotalAmount attribute value. 213 * 214 * @param creditMemoLineTotalAmount The creditMemoLineTotalAmount to set. 215 */ 216 public void setCreditMemoLineTotalAmount(KualiDecimal creditMemoLineTotalAmount) { 217 this.creditMemoLineTotalAmount = creditMemoLineTotalAmount; 218 } 219 220 /** 221 * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper() 222 */ 223 protected LinkedHashMap toStringMapper() { 224 LinkedHashMap m = new LinkedHashMap(); 225 m.put("documentNumber", this.documentNumber); 226 if (this.referenceInvoiceItemNumber != null) { 227 m.put("referenceInvoiceItemNumber", this.referenceInvoiceItemNumber.toString()); 228 } 229 return m; 230 } 231 232 public void setInvoiceLineTotalAmount(KualiDecimal invoiceLineTotalAmount) { 233 this.invoiceLineTotalAmount = invoiceLineTotalAmount; 234 } 235 236 public void recalculateBasedOnEnteredItemQty(CustomerCreditMemoDocument customerCreditMemoDocument) { 237 BigDecimal invItemUnitPrice = getCustomerInvoiceDetail().getInvoiceItemUnitPrice(); 238 239 creditMemoItemTotalAmount = new KualiDecimal(creditMemoItemQuantity.multiply(invItemUnitPrice).setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)); 240 241 if (customerCreditMemoDocument.getArTaxService().isCustomerInvoiceDetailTaxable(customerCreditMemoDocument.getInvoice(), getCustomerInvoiceDetail())) 242 creditMemoItemTaxAmount = customerCreditMemoDocument.getTaxService().getTotalSalesTaxAmount(customerCreditMemoDocument.getInvoice().getBillingDate(), customerCreditMemoDocument.getPostalCode(), creditMemoItemTotalAmount); 243 else 244 creditMemoItemTaxAmount = KualiDecimal.ZERO; 245 creditMemoLineTotalAmount = creditMemoItemTotalAmount.add(creditMemoItemTaxAmount); 246 } 247 248 public void recalculateBasedOnEnteredItemAmount(CustomerCreditMemoDocument customerCreditMemoDocument) { 249 BigDecimal invItemUnitPrice = getCustomerInvoiceDetail().getInvoiceItemUnitPrice(); 250 251 KualiDecimal kulVal = creditMemoItemTotalAmount.divide(new KualiDecimal(invItemUnitPrice), true); 252 if (kulVal.isZero() && creditMemoItemTotalAmount != null && !creditMemoItemTotalAmount.isZero()) { 253 MathContext context = new MathContext(1); 254 creditMemoItemQuantity = new BigDecimal(0.01d, context); 255 creditMemoItemQuantity.setScale(2); 256 } 257 else { 258 creditMemoItemQuantity = kulVal.bigDecimalValue(); 259 } 260 261 if (customerCreditMemoDocument.getArTaxService().isCustomerInvoiceDetailTaxable(customerCreditMemoDocument.getInvoice(), getCustomerInvoiceDetail())) 262 creditMemoItemTaxAmount = customerCreditMemoDocument.getTaxService().getTotalSalesTaxAmount(customerCreditMemoDocument.getInvoice().getBillingDate(), customerCreditMemoDocument.getPostalCode(), creditMemoItemTotalAmount); 263 else 264 creditMemoItemTaxAmount = KualiDecimal.ZERO; 265 creditMemoLineTotalAmount = creditMemoItemTotalAmount.add(creditMemoItemTaxAmount); 266 } 267 268 /** 269 * Gets the duplicateCreditMemoItemTotalAmount attribute. 270 * 271 * @return Returns the duplicateCreditMemoItemTotalAmount. 272 */ 273 public KualiDecimal getDuplicateCreditMemoItemTotalAmount() { 274 return duplicateCreditMemoItemTotalAmount; 275 } 276 277 /** 278 * Sets the duplicateCreditMemoItemTotalAmount attribute value. 279 * 280 * @param duplicateCreditMemoItemTotalAmount The duplicateCreditMemoItemTotalAmount to set. 281 */ 282 public void setDuplicateCreditMemoItemTotalAmount(KualiDecimal duplicateCreditMemoItemTotalAmount) { 283 this.duplicateCreditMemoItemTotalAmount = duplicateCreditMemoItemTotalAmount; 284 } 285 286 /** 287 * Gets the invoiceOpenItemQuantity attribute. 288 * 289 * @return Returns the invoiceOpenItemQuantity. 290 */ 291 public KualiDecimal getInvoiceOpenItemQuantity() { 292 return invoiceOpenItemQuantity; 293 } 294 295 /** 296 * Sets the invoiceOpenItemQuantity attribute value. 297 * 298 * @param invoiceOpenItemQuantity The invoiceOpenItemQuantity to set. 299 */ 300 public void setInvoiceOpenItemQuantity(KualiDecimal invoiceOpenItemQuantity) { 301 this.invoiceOpenItemQuantity = invoiceOpenItemQuantity; 302 } 303 304 public String getChartOfAccountsCode() { 305 return getCustomerInvoiceDetail().getChartOfAccountsCode(); 306 } 307 308 public String getAccountNumber() { 309 return getCustomerInvoiceDetail().getAccountNumber(); 310 } 311 312 public Account getAccount() { 313 getCustomerInvoiceDetail().refreshReferenceObject(KFSPropertyConstants.ACCOUNT); 314 return getCustomerInvoiceDetail().getAccount(); 315 } 316 317 public String getFinancialObjectCode() { 318 return getCustomerInvoiceDetail().getFinancialObjectCode(); 319 } 320 321 public ObjectCode getObjectCode() { 322 getCustomerInvoiceDetail().refreshReferenceObject(KFSPropertyConstants.OBJECT_CODE); 323 return getCustomerInvoiceDetail().getObjectCode(); 324 } 325 326 public String getOrganizationReferenceId() { 327 return getCustomerInvoiceDetail().getOrganizationReferenceId(); 328 } 329 330 public String getProjectCode() { 331 return getCustomerInvoiceDetail().getProjectCode(); 332 } 333 334 public String getReferenceNumber() { 335 return getCustomerInvoiceDetail().getReferenceNumber(); 336 } 337 338 public String getReferenceTypeCode() { 339 return getCustomerInvoiceDetail().getReferenceTypeCode(); 340 } 341 342 public String getReferenceOriginCode() { 343 return getCustomerInvoiceDetail().getReferenceOriginCode(); 344 } 345 346 public String getSubAccountNumber() { 347 return getCustomerInvoiceDetail().getSubAccountNumber(); 348 } 349 350 public String getFinancialSubObjectCode() { 351 return getCustomerInvoiceDetail().getFinancialSubObjectCode(); 352 } 353 354 public String getFinancialDocumentLineDescription() { 355 return getCustomerInvoiceDetail().getFinancialDocumentLineDescription(); 356 } 357 358 public KualiDecimal getAmount() { 359 return getCustomerInvoiceDetail().getAmount(); 360 } 361 362 public Integer getPostingYear() { 363 return getCustomerInvoiceDetail().getPostingYear(); 364 } 365 366 public String getBalanceTypeCode() { 367 return getCustomerInvoiceDetail().getBalanceTypeCode(); 368 } 369 370 public ObjectCode getAccountsReceivableObject() { 371 return getCustomerInvoiceDetail().getAccountsReceivableObject(); 372 } 373 374 public String getAccountsReceivableObjectCode() { 375 return getCustomerInvoiceDetail().getAccountsReceivableObjectCode(); 376 } 377 378 public CustomerInvoiceDetail getCustomerInvoiceDetail() { 379 380 if (ObjectUtils.isNull(customerInvoiceDetail) && StringUtils.isNotEmpty(financialDocumentReferenceInvoiceNumber) && ObjectUtils.isNotNull(referenceInvoiceItemNumber)) { 381 customerInvoiceDetail = SpringContext.getBean(CustomerInvoiceDetailService.class).getCustomerInvoiceDetail(financialDocumentReferenceInvoiceNumber, referenceInvoiceItemNumber); 382 } 383 return customerInvoiceDetail; 384 } 385 386 /** 387 * Sets the customerInvoiceDetail attribute value. 388 * 389 * @param customerInvoiceDetail The customerInvoiceDetail to set. 390 */ 391 public void setCustomerInvoiceDetail(CustomerInvoiceDetail customerInvoiceDetail) { 392 this.customerInvoiceDetail = customerInvoiceDetail; 393 } 394 395 /** 396 * Gets the financialDocumentReferenceInvoiceNumber attribute. 397 * 398 * @return Returns the financialDocumentReferenceInvoiceNumber. 399 */ 400 public String getFinancialDocumentReferenceInvoiceNumber() { 401 return financialDocumentReferenceInvoiceNumber; 402 } 403 404 /** 405 * Sets the financialDocumentReferenceInvoiceNumber attribute value. 406 * 407 * @param financialDocumentReferenceInvoiceNumber The financialDocumentReferenceInvoiceNumber to set. 408 */ 409 public void setFinancialDocumentReferenceInvoiceNumber(String financialDocumentReferenceInvoiceNumber) { 410 this.financialDocumentReferenceInvoiceNumber = financialDocumentReferenceInvoiceNumber; 411 } 412 413 public Integer getInvoiceItemNumber() { 414 return referenceInvoiceItemNumber; 415 } 416 417 public String getInvoiceReferenceNumber() { 418 return financialDocumentReferenceInvoiceNumber; 419 } 420 421 public boolean isInvoiceOpenItemQuantityZero() { 422 return KualiDecimal.ZERO.equals(getInvoiceOpenItemQuantity()); 423 } 424 425 public void setInvoiceOpenItemQuantityZero(boolean invoiceOpenItemQuantityZero) { 426 this.invoiceOpenItemQuantityZero = invoiceOpenItemQuantityZero; 427 } 428 }