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.endow.document; 017 018 import java.sql.Date; 019 import java.text.ParseException; 020 import java.util.ArrayList; 021 import java.util.Collection; 022 import java.util.HashMap; 023 import java.util.List; 024 import java.util.Map; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.apache.log4j.Logger; 028 import org.kuali.kfs.module.endow.EndowConstants; 029 import org.kuali.kfs.module.endow.EndowPropertyConstants; 030 import org.kuali.kfs.module.endow.businessobject.Tickler; 031 import org.kuali.kfs.module.endow.businessobject.TicklerKEMID; 032 import org.kuali.kfs.module.endow.businessobject.TicklerRecipientGroup; 033 import org.kuali.kfs.module.endow.businessobject.TicklerRecipientPrincipal; 034 import org.kuali.kfs.module.endow.businessobject.TicklerSecurity; 035 import org.kuali.kfs.module.endow.businessobject.TypeCode; 036 import org.kuali.kfs.module.endow.businessobject.TypeFeeMethod; 037 import org.kuali.kfs.module.endow.businessobject.lookup.CalculateProcessDateUsingFrequencyCodeService; 038 import org.kuali.kfs.module.endow.document.service.FeeMethodService; 039 import org.kuali.kfs.module.endow.document.service.FrequencyCodeService; 040 import org.kuali.kfs.module.endow.document.service.KEMService; 041 import org.kuali.kfs.module.endow.document.validation.impl.TicklerRule; 042 import org.kuali.kfs.sys.KFSConstants; 043 import org.kuali.kfs.sys.context.SpringContext; 044 import org.kuali.rice.kns.bo.PersistableBusinessObject; 045 import org.kuali.rice.kns.document.MaintenanceDocument; 046 import org.kuali.rice.kns.maintenance.KualiMaintainableImpl; 047 import org.kuali.rice.kns.maintenance.Maintainable; 048 import org.kuali.rice.kns.service.BusinessObjectService; 049 import org.kuali.rice.kns.service.DateTimeService; 050 import org.kuali.rice.kns.service.SequenceAccessorService; 051 import org.kuali.rice.kns.util.KNSConstants; 052 import org.kuali.rice.kns.util.KualiDecimal; 053 import org.kuali.rice.kns.util.ObjectUtils; 054 import org.kuali.rice.kns.web.ui.Field; 055 import org.kuali.rice.kns.web.ui.Row; 056 import org.kuali.rice.kns.web.ui.Section; 057 058 /** 059 * This class implements the hok on points associated with the Tickler. 060 * 061 * @author Tapan S Mokha 062 * @version 1.0 063 */ 064 public class TicklerMaintainableImpl extends KualiMaintainableImpl 065 { 066 067 private static Logger log = org.apache.log4j.Logger.getLogger(TicklerMaintainableImpl.class); 068 069 private Tickler newTickler; 070 private Tickler oldTickler; 071 072 private transient SequenceAccessorService sequenceAccessorService; 073 074 /** 075 * Called when page is refreshed and does 076 * 1. Updates frequency date when frequency code is selected. 077 * 078 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#refresh(java.lang.String, java.util.Map, 079 * org.kuali.rice.kns.document.MaintenanceDocument) 080 */ 081 @Override 082 public void refresh(String refreshCaller, Map fieldValues, MaintenanceDocument document) 083 { 084 super.refresh(refreshCaller, fieldValues, document); 085 086 initializeAttributes(document); 087 088 //Update Next Due date if frequency Code selected 089 updateNextDueDate(refreshCaller, fieldValues); 090 } 091 092 /** 093 * Updates Next Due date if frequency Code selected. 094 * 095 * @param refreshCaller 096 * @param fieldValues 097 */ 098 private void updateNextDueDate(String refreshCaller, Map fieldValues) 099 { 100 if (refreshCaller != null && refreshCaller.equalsIgnoreCase(EndowConstants.KUALI_FREQUENCY_LOOKUPABLE_IMPL) && fieldValues != null) 101 { 102 String frequencyCode = newTickler.getFrequencyCode(); 103 if (StringUtils.isNotEmpty(frequencyCode)) 104 { 105 FrequencyCodeService frequencyCodeService = (FrequencyCodeService) SpringContext.getBean(FrequencyCodeService.class); 106 newTickler.setNextDueDate(frequencyCodeService.calculateProcessDate(frequencyCode)); 107 } 108 } 109 } 110 111 /** 112 * Called after a copy operation is performed and performs. 113 * 1. Clears all associated collections (kemids, security, principals & groups) 114 * 115 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#processAfterCopy(org.kuali.rice.kns.document.MaintenanceDocument, 116 * java.util.Map) 117 */ 118 @Override 119 public void processAfterCopy(MaintenanceDocument arg0, Map<String, String[]> arg1) { 120 super.processAfterCopy(arg0, arg1); 121 122 initializeAttributes(arg0); 123 124 //Clears all associated collections (kemids, security, principals & groups) 125 clearAllCollections(); 126 127 } 128 129 /** 130 * Clears all associated collections (kemids, security, principals & groups) 131 */ 132 private void clearAllCollections() 133 { 134 getOldTickler().getKemIds().clear(); 135 getOldTickler().getSecurities().clear(); 136 getOldTickler().getRecipientPrincipals().clear(); 137 getOldTickler().getRecipientGroups().clear(); 138 139 getNewTickler().getKemIds().clear(); 140 getNewTickler().getSecurities().clear(); 141 getNewTickler().getRecipientPrincipals().clear(); 142 getNewTickler().getRecipientGroups().clear(); 143 } 144 145 /** 146 * Called before a Tickler is saved and performs. 147 * 1. Assign Tickler Number to Tickler in case of new or copy workflows. 148 * 2. If tickler marked as inactive, mark all associated collections: kemids, securities, principals and groups records as inactive. 149 * 150 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#prepareForSave() 151 */ 152 @Override 153 public void prepareForSave() 154 { 155 super.prepareForSave(); 156 157 Tickler tickler = (Tickler) getBusinessObject(); 158 159 //Assign Tickler Number to Tickler in case of new or copy workflows 160 assignTicklerNumber(tickler); 161 162 //Rule 18: If tickler marked as inactive, mark all associated collections: kemids, securities, principals and groups records as inactive 163 inactivateTicklerAssociations(tickler); 164 165 } 166 167 /** 168 * Assign Tickler Number to Tickler in case of new or copy workflows. 169 * 170 * @param tickler 171 */ 172 private void assignTicklerNumber(Tickler tickler) 173 { 174 if( KNSConstants.MAINTENANCE_NEW_ACTION.equals(getMaintenanceAction()) || KNSConstants.MAINTENANCE_COPY_ACTION.equals(getMaintenanceAction()) ) 175 { 176 //Only assign a Tickler number if not assigned already,may be assigned during a previous save operation. 177 if(tickler.getNumber() == null) 178 { 179 String ticklerNumber = getSequenceAccessorService().getNextAvailableSequenceNumber(EndowConstants.Sequences.END_TICKLER_SEQ).toString(); 180 tickler.setNumber(ticklerNumber); 181 } 182 } 183 } 184 185 /** 186 * If tickler marked as inactive, mark all associated collections: kemids, securities, principals and groups records as inactive. 187 * 188 * @param tickler 189 */ 190 private void inactivateTicklerAssociations(Tickler tickler) 191 { 192 if(!tickler.isActive()) 193 { 194 //Inactivate Kemids 195 for(TicklerKEMID kemId: tickler.getKemIds()) 196 { 197 kemId.setActive(false); 198 } 199 200 //Inactivate Securities 201 for(TicklerSecurity security: tickler.getSecurities()) 202 { 203 security.setActive(false); 204 } 205 206 //Inactivate Principals 207 for(TicklerRecipientPrincipal principal : tickler.getRecipientPrincipals()) 208 { 209 principal.setActive(false); 210 } 211 212 //Inactivate Groups 213 for(TicklerRecipientGroup group : tickler.getRecipientGroups()) 214 { 215 group.setActive(false); 216 } 217 218 } 219 } 220 221 /** 222 * Initializes newTickler and oldTickler. 223 * 224 * @param document 225 */ 226 private void initializeAttributes(MaintenanceDocument document) { 227 if (newTickler == null) { 228 newTickler = (Tickler) document.getNewMaintainableObject().getBusinessObject(); 229 } 230 if (oldTickler == null) { 231 oldTickler = (Tickler) document.getOldMaintainableObject().getBusinessObject(); 232 } 233 } 234 235 /** 236 * Obtain SequenceAccessorService 237 * 238 * @return 239 */ 240 public SequenceAccessorService getSequenceAccessorService() 241 { 242 if(sequenceAccessorService == null) 243 { 244 sequenceAccessorService = SpringContext.getBean(SequenceAccessorService.class); 245 } 246 return sequenceAccessorService; 247 } 248 249 public void setSequenceAccessorService(SequenceAccessorService sequenceAccessorService) { 250 this.sequenceAccessorService = sequenceAccessorService; 251 } 252 253 public Tickler getOldTickler() { 254 return oldTickler; 255 } 256 257 public void setOldTickler(Tickler oldTickler) { 258 this.oldTickler = oldTickler; 259 } 260 261 public Tickler getNewTickler() { 262 return newTickler; 263 } 264 265 public void setNewTickler(Tickler newTickler) { 266 this.newTickler = newTickler; 267 } 268 269 }