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.purap.document.validation.impl; 017 018 import java.util.Date; 019 020 import org.kuali.kfs.module.purap.PurapConstants; 021 import org.kuali.kfs.module.purap.PurapKeyConstants; 022 import org.kuali.kfs.module.purap.PurapPropertyConstants; 023 import org.kuali.kfs.module.purap.document.PurchasingDocument; 024 import org.kuali.kfs.sys.context.SpringContext; 025 import org.kuali.kfs.sys.document.validation.GenericValidation; 026 import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent; 027 import org.kuali.kfs.sys.service.UniversityDateService; 028 import org.kuali.rice.kns.service.DateTimeService; 029 import org.kuali.rice.kns.util.GlobalVariables; 030 import org.kuali.rice.kns.util.ObjectUtils; 031 032 public class PurchasingPaymentInfoValidation extends GenericValidation { 033 034 DateTimeService dateTimeService; 035 UniversityDateService universityDateService; 036 037 public boolean validate(AttributedDocumentEvent event) { 038 boolean valid = true; 039 PurchasingDocument purDocument = (PurchasingDocument)event.getDocument(); 040 041 GlobalVariables.getMessageMap().addToErrorPath(PurapConstants.PAYMENT_INFO_ERRORS); 042 valid &= checkBeginDateBeforeEndDate(purDocument); 043 if (valid && (ObjectUtils.isNotNull(purDocument.getPurchaseOrderBeginDate()) || ObjectUtils.isNotNull(purDocument.getPurchaseOrderEndDate()))) { 044 if (ObjectUtils.isNotNull(purDocument.getPurchaseOrderBeginDate()) && ObjectUtils.isNull(purDocument.getPurchaseOrderEndDate())) { 045 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_END_DATE, PurapKeyConstants.ERROR_PURCHASE_ORDER_BEGIN_DATE_NO_END_DATE); 046 valid &= false; 047 } 048 else { 049 if (ObjectUtils.isNull(purDocument.getPurchaseOrderBeginDate()) && ObjectUtils.isNotNull(purDocument.getPurchaseOrderEndDate())) { 050 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_BEGIN_DATE, PurapKeyConstants.ERROR_PURCHASE_ORDER_END_DATE_NO_BEGIN_DATE); 051 valid &= false; 052 } 053 } 054 } 055 if (valid && ObjectUtils.isNotNull(purDocument.getPurchaseOrderBeginDate()) && ObjectUtils.isNotNull(purDocument.getPurchaseOrderEndDate())) { 056 if (ObjectUtils.isNull(purDocument.getRecurringPaymentTypeCode())) { 057 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.RECURRING_PAYMENT_TYPE_CODE, PurapKeyConstants.ERROR_RECURRING_DATE_NO_TYPE); 058 059 valid &= false; 060 } 061 } 062 else if (valid && ObjectUtils.isNotNull(purDocument.getRecurringPaymentTypeCode())) { 063 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_BEGIN_DATE, PurapKeyConstants.ERROR_RECURRING_TYPE_NO_DATE); 064 valid &= false; 065 } 066 067 //checks for when FY is set to next FY 068 if (purDocument.isPostingYearNext()) { 069 Integer currentFY = universityDateService.getCurrentFiscalYear(); 070 Date closingDate = universityDateService.getLastDateOfFiscalYear(currentFY); 071 072 //if recurring payment begin dates entered, begin date must be > closing date 073 if (ObjectUtils.isNotNull(purDocument.getPurchaseOrderBeginDate()) && 074 (purDocument.getPurchaseOrderBeginDate().before(closingDate) || 075 purDocument.getPurchaseOrderBeginDate().equals(closingDate))) { 076 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_BEGIN_DATE, PurapKeyConstants.ERROR_NEXT_FY_BEGIN_DATE_INVALID); 077 valid &= false; 078 } 079 } 080 081 GlobalVariables.getMessageMap().removeFromErrorPath(PurapConstants.PAYMENT_INFO_ERRORS); 082 return valid; 083 } 084 085 /** 086 * Implementation of the rule that if a document has a recurring payment begin date and end date, the begin date should come 087 * before the end date. We needed to play around with this order if the fiscal year is the next fiscal year, since we 088 * were dealing just with month and day, but we don't need to do that here; we're dealing with the whole Date object. 089 * 090 * @param purDocument the purchasing document to be validated 091 * @return boolean false if the begin date is not before the end date. 092 */ 093 protected boolean checkBeginDateBeforeEndDate(PurchasingDocument purDocument) { 094 boolean valid = true; 095 096 Date beginDate = purDocument.getPurchaseOrderBeginDate(); 097 Date endDate = purDocument.getPurchaseOrderEndDate(); 098 if (ObjectUtils.isNotNull(beginDate) && ObjectUtils.isNotNull(endDate)) { 099 if (dateTimeService.dateDiff(beginDate, endDate, false) <= 0) { 100 valid &= false; 101 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_END_DATE, PurapKeyConstants.ERROR_PURCHASE_ORDER_BEGIN_DATE_AFTER_END); 102 } 103 } 104 105 return valid; 106 } 107 108 public DateTimeService getDateTimeService() { 109 return dateTimeService; 110 } 111 112 public void setDateTimeService(DateTimeService dateTimeService) { 113 this.dateTimeService = dateTimeService; 114 } 115 116 public UniversityDateService getUniversityDateService() { 117 return universityDateService; 118 } 119 120 public void setUniversityDateService(UniversityDateService universityDateService) { 121 this.universityDateService = universityDateService; 122 } 123 124 }