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.document.validation.impl;
017
018 import static org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants.ERROR_PATH.DOCUMENT_ERROR_PREFIX;
019
020 import java.sql.Date;
021 import java.util.Calendar;
022
023 import org.kuali.kfs.module.ar.ArKeyConstants;
024 import org.kuali.kfs.module.ar.ArPropertyConstants;
025 import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
026 import org.kuali.kfs.sys.document.validation.GenericValidation;
027 import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
028 import org.kuali.rice.kns.util.DateUtils;
029 import org.kuali.rice.kns.util.GlobalVariables;
030 import org.kuali.rice.kns.util.ObjectUtils;
031
032 public class CustomerInvoiceBothEndDateAndTotalRecurrenceNumberValidation extends GenericValidation {
033
034 private CustomerInvoiceDocument customerInvoiceDocument;
035
036 public boolean validate(AttributedDocumentEvent event) {
037
038 // short circuit if no recurrence object at all
039 if (ObjectUtils.isNull(customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails())) {
040 return true;
041 }
042
043 if (ObjectUtils.isNull(customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceBeginDate()) ||
044 ObjectUtils.isNull(customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceIntervalCode()) ||
045 ObjectUtils.isNull(customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceEndDate()) ||
046 ObjectUtils.isNull(customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentTotalRecurrenceNumber())) {
047 return true;
048 }
049
050 Calendar beginCalendar = Calendar.getInstance();
051 beginCalendar.setTime(customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceBeginDate());
052 Date beginDate = customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceBeginDate();
053 Calendar endCalendar = Calendar.getInstance();
054 endCalendar.setTime(customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceEndDate());
055 Date endDate = customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceEndDate();
056 Calendar nextCalendar = Calendar.getInstance();
057 Date nextDate = beginDate;
058
059 int totalRecurrences = 0;
060 int addCounter = 0;
061 String intervalCode = customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentRecurrenceIntervalCode();
062 if (intervalCode.equals("M")) {
063 addCounter = 1;
064 }
065 if (intervalCode.equals("Q")) {
066 addCounter = 3;
067 }
068 /* perform this loop while begin_date is less than or equal to end_date */
069 while (!(beginDate.after(endDate))){
070 beginCalendar.setTime(beginDate);
071 beginCalendar.add(Calendar.MONTH, addCounter);
072 beginDate = DateUtils.convertToSqlDate(beginCalendar.getTime());
073 totalRecurrences++;
074 nextDate = beginDate;
075 nextCalendar.setTime(nextDate);
076 nextCalendar.add(Calendar.MONTH, addCounter);
077 nextDate = DateUtils.convertToSqlDate(nextCalendar.getTime());
078 if (endDate.after(beginDate) && endDate.before(nextDate)) {
079 totalRecurrences++;
080 break;
081 }
082 }
083 if (totalRecurrences != customerInvoiceDocument.getCustomerInvoiceRecurrenceDetails().getDocumentTotalRecurrenceNumber().intValue()) {
084 GlobalVariables.getMessageMap().putError(DOCUMENT_ERROR_PREFIX + ArPropertyConstants.CustomerInvoiceDocumentFields.INVOICE_DOCUMENT_RECURRENCE_END_DATE, ArKeyConstants.ERROR_END_DATE_AND_TOTAL_NUMBER_OF_RECURRENCES_NOT_VALID);
085 return false;
086 }
087 return true;
088 }
089
090 public CustomerInvoiceDocument getCustomerInvoiceDocument() {
091 return customerInvoiceDocument;
092 }
093
094 public void setCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument) {
095 this.customerInvoiceDocument = customerInvoiceDocument;
096 }
097 }