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    }