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 }