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 /* 017 * Created on Aug 12, 2004 018 */ 019 package org.kuali.kfs.pdp.service.impl; 020 021 import java.sql.Timestamp; 022 import java.util.Date; 023 import java.util.List; 024 025 import org.kuali.kfs.pdp.PdpConstants; 026 import org.kuali.kfs.pdp.PdpKeyConstants; 027 import org.kuali.kfs.pdp.businessobject.PaymentChangeCode; 028 import org.kuali.kfs.pdp.businessobject.PaymentGroup; 029 import org.kuali.kfs.pdp.businessobject.PaymentGroupHistory; 030 import org.kuali.kfs.pdp.businessobject.PaymentStatus; 031 import org.kuali.kfs.pdp.dataaccess.BatchMaintenanceDao; 032 import org.kuali.kfs.pdp.service.BatchMaintenanceService; 033 import org.kuali.kfs.pdp.service.PaymentGroupService; 034 import org.kuali.rice.kim.bo.Person; 035 import org.kuali.rice.kns.service.BusinessObjectService; 036 import org.kuali.rice.kns.util.GlobalVariables; 037 import org.kuali.rice.kns.util.KNSConstants; 038 import org.springframework.transaction.annotation.Transactional; 039 040 /** 041 * This class provides methods for Batch maintenance. 042 */ 043 @Transactional 044 public class BatchMaintenanceServiceImpl implements BatchMaintenanceService { 045 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BatchMaintenanceServiceImpl.class); 046 047 private BatchMaintenanceDao batchMaintenanceDao; 048 private BusinessObjectService businessObjectService; 049 private PaymentGroupService paymentGroupService; 050 051 /** 052 * This method changes the status for PaymentGroup and PaymentGroupHistory. 053 * 054 * @param paymentGroup the PaymentGroup to change the status 055 * @param newPaymentStatus the new payment status 056 * @param changeStatus the payment change status code 057 * @param note a note from the user 058 */ 059 public void changeStatus(PaymentGroup paymentGroup, String newPaymentStatus, String changeStatus, String note, Person user) { 060 LOG.debug("changeStatus() enter method with new status of " + newPaymentStatus); 061 062 PaymentGroupHistory paymentGroupHistory = new PaymentGroupHistory(); 063 PaymentChangeCode paymentChange = (PaymentChangeCode) businessObjectService.findBySinglePrimaryKey(PaymentChangeCode.class, changeStatus); 064 065 paymentGroupHistory.setPaymentChange(paymentChange); 066 paymentGroupHistory.setOrigPaymentStatus(paymentGroup.getPaymentStatus()); 067 paymentGroupHistory.setChangeUser(user); 068 paymentGroupHistory.setChangeNoteText(note); 069 paymentGroupHistory.setPaymentGroup(paymentGroup); 070 paymentGroupHistory.setChangeTime(new Timestamp(new Date().getTime())); 071 072 this.businessObjectService.save(paymentGroupHistory); 073 074 PaymentStatus paymentStatus = (PaymentStatus) businessObjectService.findBySinglePrimaryKey(PaymentStatus.class, newPaymentStatus); 075 076 paymentGroup.setPaymentStatus(paymentStatus); 077 078 this.businessObjectService.save(paymentGroup); 079 080 LOG.debug("changeStatus() Status has been changed; exit method."); 081 } 082 083 /** 084 * cancelPendingBatch() This method cancels a pending batch by canceling each payment in the batch if the following rules apply. - 085 * All payments must have a status of 'OPEN'. 086 * 087 * @param paymentBatchId (Integer) Primary key of the Pending Batch to be canceled. 088 * @param note (String) Change note text entered by user. 089 * @param user (User) Actor making change. 090 */ 091 public boolean cancelPendingBatch(Integer paymentBatchId, String note, Person user) { 092 LOG.debug("cancelPendingBatch() Enter method to cancel batch with id = " + paymentBatchId); 093 094 if (doBatchPaymentsHaveOpenOrHeldStatus(paymentBatchId)) { 095 List<PaymentGroup> paymentGroupList = this.paymentGroupService.getByBatchId(paymentBatchId); 096 097 if (paymentGroupList == null || paymentGroupList.isEmpty()) { 098 LOG.debug("cancelPendingBatch() Pending payment groups not found for batchId; throw exception."); 099 100 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_PENDING_PAYMNET_GROUP_NOT_FOUND); 101 102 return false; 103 } 104 105 // cancel each payment 106 // All actions must be performed on entire group not individual detail record 107 for (PaymentGroup paymentGroup : paymentGroupList) { 108 changeStatus(paymentGroup, PdpConstants.PaymentStatusCodes.CANCEL_PAYMENT, PdpConstants.PaymentChangeCodes.CANCEL_BATCH_CHNG_CD, note, user); 109 } 110 111 LOG.debug("cancelPendingBatch() All payment groups in batch have been canceled; exit method."); 112 } 113 else { 114 LOG.debug("cancelPendingBatch() Not all payment groups are open; cannot cancel batch."); 115 116 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_NOT_ALL_PAYMENT_GROUPS_OPEN_CANNOT_CANCEL); 117 118 return false; 119 } 120 return true; 121 } 122 123 /** 124 * holdPendingBatch() This method holds a pending batch by holding each payment in the batch if the following rules apply. - All 125 * payments must have a status of 'OPEN'. 126 * 127 * @param paymentBatchId (Integer) Primary key of the Pending Batch to be held. 128 * @param note (String) Change note text entered by user. 129 * @param user (User) Actor making change. 130 */ 131 public boolean holdPendingBatch(Integer paymentBatchId, String note, Person user) { 132 LOG.debug("holdPendingBatch() Enter method to hold batch with id = " + paymentBatchId); 133 134 if (doBatchPaymentsHaveOpenStatus(paymentBatchId)) { 135 List<PaymentGroup> paymentGroupList = this.paymentGroupService.getByBatchId(paymentBatchId); 136 137 if (paymentGroupList == null || paymentGroupList.isEmpty()) { 138 LOG.debug("holdPendingBatch() Pending payment groups not found for batchId; throw exception."); 139 140 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_PENDING_PAYMNET_GROUP_NOT_FOUND); 141 142 return false; 143 } 144 145 // hold each payment 146 // All actions must be performed on entire group not individual detail record 147 for (PaymentGroup paymentGroup : paymentGroupList) { 148 changeStatus(paymentGroup, PdpConstants.PaymentStatusCodes.HELD_CD, PdpConstants.PaymentChangeCodes.HOLD_BATCH_CHNG_CD, note, user); 149 } 150 151 LOG.debug("holdPendingBatch() All payment groups in batch have been held; exit method."); 152 } 153 else { 154 LOG.debug("holdPendingBatch() Not all payment groups are open; cannot hold batch."); 155 156 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_NOT_ALL_PAYMENT_GROUPS_OPEN_CANNOT_HOLD); 157 158 return false; 159 } 160 return true; 161 } 162 163 /** 164 * removeBatchHold() This method removes holds on batches of payments if the following rules apply. - All Payments' statuses in 165 * batch must be: "held". 166 * 167 * @param paymentBatchId (Integer) Primary key of the Pending Batch to be released from hold. 168 * @param note (String) Change note text entered by user. 169 * @param user (User) Actor making change. 170 */ 171 public boolean removeBatchHold(Integer paymentBatchId, String note, Person user) { 172 LOG.debug("removeBatchHold() Enter method to remove hold batch with id = " + paymentBatchId); 173 174 if (doBatchPaymentsHaveHeldStatus(paymentBatchId)) { 175 List<PaymentGroup> paymentGroupList = this.paymentGroupService.getByBatchId(paymentBatchId); 176 177 if (paymentGroupList == null || paymentGroupList.isEmpty()) { 178 LOG.debug("removeBatchHold() Pending payment groups not found for batchId; throw exception."); 179 180 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_PENDING_PAYMNET_GROUP_NOT_FOUND); 181 182 return false; 183 } 184 185 // hold each payment 186 // All actions must be performed on entire group not individual detail record 187 for (PaymentGroup paymentGroup : paymentGroupList) { 188 changeStatus(paymentGroup, PdpConstants.PaymentStatusCodes.OPEN, PdpConstants.PaymentChangeCodes.REMOVE_HOLD_BATCH_CHNG_CD, note, user); 189 } 190 191 LOG.debug("removeBatchHold() All payment groups in batch have been held; exit method."); 192 } 193 else { 194 LOG.debug("removeBatchHold() Not all payment groups are open; cannot remove hold on batch."); 195 196 GlobalVariables.getMessageMap().putError(KNSConstants.GLOBAL_ERRORS, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_NOT_ALL_PAYMENT_GROUPS_OPEN_CANNOT_REMOVE_HOLD); 197 198 return false; 199 } 200 return true; 201 202 } 203 204 /** 205 * @see org.kuali.kfs.pdp.document.service.BatchMaintenanceService#doBatchPaymentsHaveOpenStatus(java.lang.Integer) 206 */ 207 public boolean doBatchPaymentsHaveOpenStatus(Integer batchId) { 208 return batchMaintenanceDao.doBatchPaymentsHaveOpenStatus(batchId); 209 } 210 211 /** 212 * @see org.kuali.kfs.pdp.document.service.BatchMaintenanceService#doBatchPaymentsHaveHeldStatus(java.lang.Integer) 213 */ 214 public boolean doBatchPaymentsHaveHeldStatus(Integer batchId) { 215 return batchMaintenanceDao.doBatchPaymentsHaveHeldStatus(batchId); 216 } 217 218 /** 219 * @see org.kuali.kfs.pdp.document.service.BatchMaintenanceService#doBatchPaymentsHaveOpenOrHeldStatus(java.lang.Integer) 220 */ 221 public boolean doBatchPaymentsHaveOpenOrHeldStatus(Integer batchId) { 222 LOG.debug("doBatchPaymentsHaveOpenOrHeldStatus() enter method."); 223 224 if ((doBatchPaymentsHaveOpenStatus(batchId)) || (doBatchPaymentsHaveHeldStatus(batchId))) { 225 LOG.debug("doBatchPaymentsHaveOpenOrHeldStatus() All payment groups have status 'HELD' or all payments have status 'OPEN'."); 226 227 return true; 228 } 229 else { 230 LOG.debug("doBatchPaymentsHaveOpenOrHeldStatus() Not all payment groups have status 'HELD' or not all payments have status 'OPEN'."); 231 232 return false; 233 } 234 } 235 236 /** 237 * This method sets the batchMaintenanceDao 238 * 239 * @param batchMaintenanceDao BatchMaintenanceDao 240 */ 241 public void setBatchMaintenanceDao(BatchMaintenanceDao batchMaintenanceDao) { 242 this.batchMaintenanceDao = batchMaintenanceDao; 243 } 244 245 /** 246 * Sets the business object service 247 * 248 * @param businessObjectService 249 */ 250 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 251 this.businessObjectService = businessObjectService; 252 } 253 254 public void setPaymentGroupService(PaymentGroupService paymentGroupService) { 255 this.paymentGroupService = paymentGroupService; 256 } 257 258 } 259