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 }