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.util.Collection;
019    import java.util.LinkedHashMap;
020    import java.util.List;
021    
022    import org.kuali.kfs.coa.businessobject.AccountingPeriod;
023    import org.kuali.kfs.coa.businessobject.ObjectCode;
024    import org.kuali.kfs.module.ar.ArConstants;
025    import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
026    import org.kuali.kfs.module.ar.document.service.SystemInformationService;
027    import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader;
028    import org.kuali.kfs.module.ar.businessobject.NonAppliedDistribution;
029    import org.kuali.kfs.module.ar.businessobject.NonInvoicedDistribution;
030    import org.kuali.kfs.sys.context.SpringContext;
031    import org.kuali.kfs.sys.service.UniversityDateService;
032    import org.kuali.rice.kew.exception.WorkflowException;
033    import org.kuali.rice.kns.bo.PersistableBusinessObjectBase;
034    import org.kuali.rice.kns.service.DocumentService;
035    import org.kuali.rice.kns.service.ParameterService;
036    import org.kuali.rice.kns.util.KualiDecimal;
037    
038    /**
039     * @author Kuali Nervous System Team (kualidev@oncourse.iu.edu)
040     */
041    public class InvoicePaidApplied extends PersistableBusinessObjectBase {
042    
043        private String documentNumber; // document the payment is being applied FROM
044        private Integer paidAppliedItemNumber;
045        private String financialDocumentReferenceInvoiceNumber; // document the payment is being applied TO
046        private Integer invoiceItemNumber;
047        private Integer universityFiscalYear;
048        private String universityFiscalPeriodCode;
049        private KualiDecimal invoiceItemAppliedAmount = KualiDecimal.ZERO;
050    
051        private CustomerInvoiceDetail invoiceDetail;
052        private AccountingPeriod universityFiscalPeriod;
053        private FinancialSystemDocumentHeader documentHeader;
054        transient private DocumentService documentService;
055        private KualiDecimal paidAppiedDistributionAmount = KualiDecimal.ZERO;
056        private Collection<NonInvoicedDistribution> nonInvoicedDistributions;
057        private Collection<NonAppliedDistribution> nonAppliedDistributions;
058        private transient CustomerInvoiceDocument customerInvoiceDocument;
059    
060        /**
061         * Default constructor.
062         */
063        public InvoicePaidApplied() {
064        }
065    
066        public InvoicePaidApplied(String documentNumber, String refInvoiceDocNumber, Integer invoiceSequenceNumber, KualiDecimal appliedAmount, Integer paidAppliedItemNumber, Integer universityFiscalYear, String universityFiscalPeriodCode) {
067            this.documentNumber = documentNumber;
068            this.financialDocumentReferenceInvoiceNumber = refInvoiceDocNumber;
069            this.invoiceItemNumber = invoiceSequenceNumber;
070            this.paidAppliedItemNumber = paidAppliedItemNumber;
071            this.invoiceItemAppliedAmount = appliedAmount;
072            this.universityFiscalYear = universityFiscalYear;
073            this.universityFiscalPeriodCode = universityFiscalPeriodCode;
074        }
075    
076        /**
077         * Constructs a InvoicePaidApplied object, and assumes the current Fiscal Year and FiscalPeriodCode.
078         * 
079         * @param documentNumber
080         * @param refInvoiceDocNumber
081         * @param invoiceSequenceNumber
082         * @param appliedAmount
083         * @param paidAppliedItemNumber
084         */
085        public InvoicePaidApplied(String documentNumber, String refInvoiceDocNumber, Integer invoiceSequenceNumber, KualiDecimal appliedAmount, Integer paidAppliedItemNumber) {
086            this.documentNumber = documentNumber;
087            this.financialDocumentReferenceInvoiceNumber = refInvoiceDocNumber;
088            this.invoiceItemNumber = invoiceSequenceNumber;
089            this.paidAppliedItemNumber = paidAppliedItemNumber;
090            this.invoiceItemAppliedAmount = appliedAmount;
091    
092            UniversityDateService universityDateService = SpringContext.getBean(UniversityDateService.class);
093            this.universityFiscalYear = universityDateService.getCurrentFiscalYear();
094            this.universityFiscalPeriodCode = universityDateService.getCurrentUniversityDate().getAccountingPeriod().getUniversityFiscalPeriodCode();
095        }
096    
097        public DocumentService getDocumentService() {
098            if (null == documentService) {
099                documentService = SpringContext.getBean(DocumentService.class);
100            }
101            return documentService;
102        }
103    
104        public void setDocumentService(DocumentService documentService) {
105            this.documentService = documentService;
106        }
107    
108        public CustomerInvoiceDocument getCustomerInvoiceDocument() {
109            CustomerInvoiceDocument _customerInvoiceDocument = null;
110            try {
111                _customerInvoiceDocument = (CustomerInvoiceDocument) getDocumentService().getByDocumentHeaderId(getFinancialDocumentReferenceInvoiceNumber());
112            }
113            catch (WorkflowException e) {
114                throw new RuntimeException("WorkflowException thrown when trying to retrieve Invoice document [" + getFinancialDocumentReferenceInvoiceNumber() + "]", e);
115            }
116            return _customerInvoiceDocument;
117        }
118    
119        public ObjectCode getAccountsReceivableObjectCode() {
120    
121            // make sure its all re-connected with child objects
122            getInvoiceDetail().refresh();
123            getInvoiceDetail().refreshNonUpdateableReferences();
124    
125            String parameterName = ArConstants.GLPE_RECEIVABLE_OFFSET_GENERATION_METHOD;
126            ParameterService parameterService = SpringContext.getBean(ParameterService.class);
127            String parameterValue = parameterService.getParameterValue(CustomerInvoiceDocument.class, parameterName);
128    
129            ObjectCode objectCode = null;
130            if ("1".equals(parameterValue) || "2".equals(parameterValue)) {
131                getInvoiceDetail().refreshReferenceObject("objectCode");
132                objectCode = getInvoiceDetail().getObjectCode();
133            }
134            else if ("3".equals(parameterValue)) {
135                CustomerInvoiceDocument customerInvoiceDocument = getInvoiceDetail().getCustomerInvoiceDocument();
136                customerInvoiceDocument.refreshReferenceObject("paymentFinancialObject");
137                objectCode = getInvoiceDetail().getCustomerInvoiceDocument().getPaymentFinancialObject();
138            }
139            else {
140                throw new RuntimeException("No AR ObjectCode was available for this InvoicePaidApplied, which should never happen.");
141            }
142    
143            return objectCode;
144        }
145    
146        public SystemInformation getSystemInformation() {
147            String processingOrgCode = getCustomerInvoiceDocument().getAccountsReceivableDocumentHeader().getProcessingOrganizationCode();
148            String processingChartCode = getCustomerInvoiceDocument().getAccountsReceivableDocumentHeader().getProcessingChartOfAccountCode();
149    
150            SystemInformationService sysInfoService = SpringContext.getBean(SystemInformationService.class);
151            Integer currentFiscalYear = SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear();
152            SystemInformation systemInformation = sysInfoService.getByProcessingChartOrgAndFiscalYear(processingChartCode, processingOrgCode, currentFiscalYear);
153    
154            if (systemInformation == null) {
155                throw new RuntimeException("The InvoicePaidApplied doesnt have an associated SystemInformation.  This should never happen.");
156            }
157            return systemInformation;
158        }
159    
160        /**
161         * Gets the documentNumber attribute.
162         * 
163         * @return Returns the documentNumber
164         */
165        public String getDocumentNumber() {
166            return documentNumber;
167        }
168    
169        /**
170         * Sets the documentNumber attribute.
171         * 
172         * @param documentNumber The documentNumber to set.
173         */
174        public void setDocumentNumber(String documentNumber) {
175            this.documentNumber = documentNumber;
176        }
177    
178    
179        /**
180         * Gets the paidAppliedItemNumber attribute.
181         * 
182         * @return Returns the paidAppliedItemNumber
183         */
184        public Integer getPaidAppliedItemNumber() {
185            return paidAppliedItemNumber;
186        }
187    
188        /**
189         * Sets the paidAppliedItemNumber attribute.
190         * 
191         * @param paidAppliedItemNumber The paidAppliedItemNumber to set.
192         */
193        public void setPaidAppliedItemNumber(Integer paidAppliedItemNumber) {
194            this.paidAppliedItemNumber = paidAppliedItemNumber;
195        }
196    
197    
198        /**
199         * Gets the financialDocumentReferenceInvoiceNumber attribute.
200         * 
201         * @return Returns the financialDocumentReferenceInvoiceNumber
202         */
203        public String getFinancialDocumentReferenceInvoiceNumber() {
204            return financialDocumentReferenceInvoiceNumber;
205        }
206    
207        /**
208         * Sets the financialDocumentReferenceInvoiceNumber attribute.
209         * 
210         * @param financialDocumentReferenceInvoiceNumber The financialDocumentReferenceInvoiceNumber to set.
211         */
212        public void setFinancialDocumentReferenceInvoiceNumber(String financialDocumentReferenceInvoiceNumber) {
213            this.financialDocumentReferenceInvoiceNumber = financialDocumentReferenceInvoiceNumber;
214        }
215    
216        /**
217         * Gets the invoiceItemNumber attribute.
218         * 
219         * @return Returns the invoiceItemNumber
220         */
221        public Integer getInvoiceItemNumber() {
222            return invoiceItemNumber;
223        }
224    
225        /**
226         * Sets the invoiceItemNumber attribute.
227         * 
228         * @param invoiceItemNumber The invoiceItemNumber to set.
229         */
230        public void setInvoiceItemNumber(Integer invoiceItemNumber) {
231            this.invoiceItemNumber = invoiceItemNumber;
232        }
233    
234        /**
235         * Gets the universityFiscalYear attribute.
236         * 
237         * @return Returns the universityFiscalYear
238         */
239        public Integer getUniversityFiscalYear() {
240            return universityFiscalYear;
241        }
242    
243        /**
244         * Sets the universityFiscalYear attribute.
245         * 
246         * @param universityFiscalYear The universityFiscalYear to set.
247         */
248        public void setUniversityFiscalYear(Integer universityFiscalYear) {
249            this.universityFiscalYear = universityFiscalYear;
250        }
251    
252        /**
253         * Gets the universityFiscalPeriodCode attribute.
254         * 
255         * @return Returns the universityFiscalPeriodCode
256         */
257        public String getUniversityFiscalPeriodCode() {
258            return universityFiscalPeriodCode;
259        }
260    
261        /**
262         * Sets the universityFiscalPeriodCode attribute.
263         * 
264         * @param universityFiscalPeriodCode The universityFiscalPeriodCode to set.
265         */
266        public void setUniversityFiscalPeriodCode(String universityFiscalPeriodCode) {
267            this.universityFiscalPeriodCode = universityFiscalPeriodCode;
268        }
269    
270        public FinancialSystemDocumentHeader getDocumentHeader() {
271            return documentHeader;
272        }
273    
274        public void setDocumentHeader(FinancialSystemDocumentHeader documentHeader) {
275            this.documentHeader = documentHeader;
276        }
277    
278        /**
279         * Gets the invoiceItemAppliedAmount attribute.
280         * 
281         * @return Returns the invoiceItemAppliedAmount
282         */
283        public KualiDecimal getInvoiceItemAppliedAmount() {
284            return invoiceItemAppliedAmount;
285        }
286    
287        /**
288         * Sets the invoiceItemAppliedAmount attribute.
289         * 
290         * @param invoiceItemAppliedAmount The invoiceItemAppliedAmount to set.
291         */
292        public void setInvoiceItemAppliedAmount(KualiDecimal invoiceItemAppliedAmount) {
293            this.invoiceItemAppliedAmount = invoiceItemAppliedAmount;
294        }
295    
296        /**
297         * Gets the invoiceItem attribute.
298         * 
299         * @return Returns the invoiceItem
300         */
301        public CustomerInvoiceDetail getInvoiceDetail() {
302            return invoiceDetail;
303        }
304    
305        /**
306         * Gets the universityFiscalPeriod attribute.
307         * 
308         * @return Returns the universityFiscalPeriod
309         */
310        public AccountingPeriod getUniversityFiscalPeriod() {
311            return universityFiscalPeriod;
312        }
313    
314        /**
315         * Sets the universityFiscalPeriod attribute.
316         * 
317         * @param universityFiscalPeriod The universityFiscalPeriod to set.
318         * @deprecated
319         */
320        public void setUniversityFiscalPeriod(AccountingPeriod universityFiscalPeriod) {
321            this.universityFiscalPeriod = universityFiscalPeriod;
322        }
323    
324        /**
325         * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
326         */
327        @SuppressWarnings("unchecked")
328        protected LinkedHashMap toStringMapper() {
329            LinkedHashMap m = new LinkedHashMap();
330            m.put("documentNumber", this.documentNumber);
331            if (this.paidAppliedItemNumber != null) {
332                m.put("paidAppliedItemNumber", this.paidAppliedItemNumber.toString());
333            }
334            return m;
335        }
336    
337        /**
338         * Get the paidAppiedDistributionAmount attribute.
339         * 
340         * @return Returns the paidAppiedDistributionAmount
341         */
342        public KualiDecimal getPaidAppiedDistributionAmount() {
343            return paidAppiedDistributionAmount;
344        }
345    
346        /**
347         * Set the paidAppiedDistributionAmount attribute.
348         * 
349         * @param paidAppiedDistributionAmount The paidAppiedDistributionAmount to set.
350         */
351        public void setPaidAppiedDistributionAmount(KualiDecimal paidAppiedDistributionAmount) {
352            this.paidAppiedDistributionAmount = paidAppiedDistributionAmount;
353        }
354    
355        /**
356         * Gets the nonInvoicedDistributions attribute.
357         * 
358         * @return Returns the nonInvoicedDistributions.
359         */
360        public Collection<NonInvoicedDistribution> getNonInvoicedDistributions() {
361            return nonInvoicedDistributions;
362        }
363    
364        /**
365         * Sets the nonInvoicedDistributions attribute value.
366         * 
367         * @param nonInvoicedDistributions The nonInvoicedDistributions to set.
368         */
369        public void setNonInvoicedDistributions(Collection<NonInvoicedDistribution> nonInvoicedDistributions) {
370            this.nonInvoicedDistributions = nonInvoicedDistributions;
371        }
372    
373        /**
374         * Gets the nonAppliedDistributions attribute.
375         * 
376         * @return Returns the nonAppliedDistributions.
377         */
378        public Collection<NonAppliedDistribution> getNonAppliedDistributions() {
379            return nonAppliedDistributions;
380        }
381    
382        /**
383         * Sets the nonAppliedDistributions attribute value.
384         * 
385         * @param nonAppliedDistributions The nonAppliedDistributions to set.
386         */
387        public void setNonAppliedDistributions(List<NonAppliedDistribution> nonAppliedDistributions) {
388            this.nonAppliedDistributions = nonAppliedDistributions;
389        }
390    
391        /**
392         * Sets the customerInvoiceDocument attribute value.
393         * 
394         * @param customerInvoiceDocument The customerInvoiceDocument to set.
395         */
396        public void setCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument) {
397            this.customerInvoiceDocument = customerInvoiceDocument;
398        }
399    
400    }