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    }