001 /**
002 * Copyright 2004-2013 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.hr.lm.balancetransfer.service;
017
018 import java.math.BigDecimal;
019 import java.sql.Date;
020 import java.util.ArrayList;
021 import java.util.HashMap;
022 import java.util.List;
023 import java.util.Map;
024
025 import org.apache.commons.collections.CollectionUtils;
026 import org.apache.commons.lang.StringUtils;
027
028 import org.kuali.hr.lm.LMConstants;
029 import org.kuali.hr.lm.accrual.AccrualCategory;
030 import org.kuali.hr.lm.accrual.AccrualCategoryRule;
031 import org.kuali.hr.lm.balancetransfer.BalanceTransfer;
032 import org.kuali.hr.lm.balancetransfer.dao.BalanceTransferDao;
033 import org.kuali.hr.lm.employeeoverride.EmployeeOverride;
034 import org.kuali.hr.lm.leaveblock.LeaveBlock;
035 import org.kuali.hr.lm.leaveblock.LeaveBlockHistory;
036
037 import org.kuali.hr.time.service.base.TkServiceLocator;
038 import org.kuali.hr.time.util.TKUtils;
039
040 import org.kuali.rice.kew.api.exception.WorkflowException;
041 import org.kuali.rice.kim.api.identity.principal.EntityNamePrincipalName;
042 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
043 import org.kuali.rice.krad.maintenance.MaintenanceDocument;
044 import org.kuali.rice.krad.service.KRADServiceLocator;
045 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
046 import org.kuali.rice.krad.util.KRADConstants;
047 import org.kuali.rice.krad.util.ObjectUtils;
048
049 public class BalanceTransferServiceImpl implements BalanceTransferService {
050
051 private BalanceTransferDao balanceTransferDao;
052
053 @Override
054 public List<BalanceTransfer> getAllBalanceTransfersForPrincipalId(
055 String principalId) {
056 return balanceTransferDao.getAllBalanceTransfersForPrincipalId(principalId);
057 }
058
059 @Override
060 public List<BalanceTransfer> getAllBalanceTransferForPrincipalIdAsOfDate(
061 String principalId, Date effectiveDate) {
062 return balanceTransferDao.getAllBalanceTransferForPrincipalIdAsOfDate(principalId,effectiveDate);
063 }
064
065 @Override
066 public List<BalanceTransfer> getAllBalanceTransferByEffectiveDate(
067 Date effectiveDate) {
068 return balanceTransferDao.getAllBalanceTransferByEffectiveDate(effectiveDate);
069 }
070
071 @Override
072 public BalanceTransfer getBalanceTransferById(String balanceTransferId) {
073 return balanceTransferDao.getBalanceTransferById(balanceTransferId);
074 }
075
076 @Override
077 public BalanceTransfer initializeTransfer(String principalId, String accrualCategoryRule, BigDecimal accruedBalance, Date effectiveDate) {
078 //Initially, principals may be allowed to edit the transfer amount when prompted to submit this balance transfer, however,
079 //a base transfer amount together with a forfeited amount is calculated to bring the balance back to its limit in accordance
080 //with transfer limits. This "default" transfer object is used to adjust forfeiture when the user changes the transfer amount.
081 BalanceTransfer bt = null;
082 AccrualCategoryRule accrualRule = TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(accrualCategoryRule);
083
084 if(ObjectUtils.isNotNull(accrualRule) && ObjectUtils.isNotNull(accruedBalance)) {
085 bt = new BalanceTransfer();
086 //These two objects are essential to balance transfers triggered when the employee submits their leave calendar for approval.
087 //Neither of these objects should be null, otherwise this method could not have been called.
088 AccrualCategory fromAccrualCategory = TkServiceLocator.getAccrualCategoryService().getAccrualCategory(accrualRule.getLmAccrualCategoryId());
089 AccrualCategory toAccrualCategory = TkServiceLocator.getAccrualCategoryService().getAccrualCategory(accrualRule.getMaxBalanceTransferToAccrualCategory(),effectiveDate);
090 BigDecimal fullTimeEngagement = TkServiceLocator.getJobService().getFteSumForAllActiveLeaveEligibleJobs(principalId, effectiveDate);
091
092 BigDecimal transferConversionFactor = null;
093 if(ObjectUtils.isNotNull(accrualRule.getMaxBalanceTransferConversionFactor()))
094 transferConversionFactor = accrualRule.getMaxBalanceTransferConversionFactor();
095
096 // AccrualRule.maxBalance == null -> no balance limit. No balance limit -> no accrual triggered transfer / payout / lose.
097 // execution point should not be here if max balance on accrualRule is null, unless there exists an employee override.
098 BigDecimal maxBalance = accrualRule.getMaxBalance();
099 BigDecimal adjustedMaxBalance = maxBalance.multiply(fullTimeEngagement).setScale(2);
100
101 BigDecimal maxTransferAmount = null;
102 BigDecimal adjustedMaxTransferAmount = null;
103 if(ObjectUtils.isNotNull(accrualRule.getMaxTransferAmount())) {
104 maxTransferAmount = new BigDecimal(accrualRule.getMaxTransferAmount());
105 adjustedMaxTransferAmount = maxTransferAmount.multiply(fullTimeEngagement).setScale(2);
106 }
107 else {
108 // no limit on transfer amount
109 maxTransferAmount = new BigDecimal(Long.MAX_VALUE);
110 adjustedMaxTransferAmount = maxTransferAmount;
111 }
112
113 BigDecimal maxCarryOver = null;
114 BigDecimal adjustedMaxCarryOver = null;
115 if(ObjectUtils.isNotNull(accrualRule.getMaxCarryOver())) {
116 maxCarryOver = new BigDecimal(accrualRule.getMaxCarryOver());
117 adjustedMaxCarryOver = maxCarryOver.multiply(fullTimeEngagement).setScale(2);
118 }
119 else {
120 //no limit to carry over.
121 maxCarryOver = new BigDecimal(Long.MAX_VALUE);
122 adjustedMaxCarryOver = maxCarryOver;
123 }
124
125 List<EmployeeOverride> overrides = TkServiceLocator.getEmployeeOverrideService().getEmployeeOverrides(principalId, effectiveDate);
126 for(EmployeeOverride override : overrides) {
127 if(StringUtils.equals(override.getAccrualCategory(),fromAccrualCategory.getAccrualCategory())) {
128 //Do not pro-rate override values for FTE.
129 if(StringUtils.equals(override.getOverrideType(),"MB"))
130 adjustedMaxBalance = new BigDecimal(override.getOverrideValue());
131 if(StringUtils.equals(override.getOverrideType(),"MTA"))
132 adjustedMaxTransferAmount = new BigDecimal(override.getOverrideValue());
133 if(StringUtils.equals(override.getOverrideType(),"MAC"))
134 adjustedMaxCarryOver = new BigDecimal(override.getOverrideValue());
135 }
136 }
137
138 BigDecimal transferAmount = accruedBalance.subtract(adjustedMaxBalance);
139 if(StringUtils.equals(accrualRule.getActionAtMaxBalance(),LMConstants.ACTION_AT_MAX_BAL.LOSE)) {
140 //Move all time in excess of employee's fte adjusted max balance to forfeiture.
141 bt.setForfeitedAmount(transferAmount);
142 //There is no transfer to another accrual category.
143 bt.setTransferAmount(BigDecimal.ZERO);
144 bt.setAmountTransferred(BigDecimal.ZERO);
145 // to accrual category is a required field on maintenance document. Set as from accrual category
146 // to remove validation errors when routing, approving, etc.
147 bt.setToAccrualCategory(fromAccrualCategory.getAccrualCategory());
148 }
149 else {
150 // ACTION_AT_MAX_BAL = TRANSFER
151 bt.setToAccrualCategory(toAccrualCategory.getAccrualCategory());
152 if(transferAmount.compareTo(adjustedMaxTransferAmount) > 0) {
153 //there's forfeiture.
154 //bring transfer amount down to the adjusted maximum transfer amount, and place excess in forfeiture.
155 //accruedBalance - adjustedMaxTransferAmount - adjustedMaxBalance = forfeiture.
156 //transferAmount = accruedBalance - adjustedMaxBalance; forfeiture = transferAmount - adjustedMaxTransferAmount.
157 BigDecimal forfeiture = transferAmount.subtract(adjustedMaxTransferAmount).setScale(2);
158 forfeiture = forfeiture.stripTrailingZeros();
159 bt.setForfeitedAmount(forfeiture);
160 bt.setTransferAmount(adjustedMaxTransferAmount);
161 }
162 else {
163 bt.setTransferAmount(transferAmount);
164 bt.setForfeitedAmount(BigDecimal.ZERO);
165 }
166 }
167
168 assert(adjustedMaxBalance.compareTo(accruedBalance.subtract(bt.getTransferAmount().add(bt.getForfeitedAmount()))) == 0);
169
170 // Max Carry Over logic for Year End transfers.
171 if(StringUtils.equals(accrualRule.getMaxBalanceActionFrequency(),LMConstants.MAX_BAL_ACTION_FREQ.YEAR_END)) {
172
173 //At this point, transfer amount and forfeiture have been set so that the new accrued balance will be the
174 //adjusted max balance, so this amount is used to check against carry over.
175 if(adjustedMaxBalance.compareTo(adjustedMaxCarryOver) > 0) {
176 BigDecimal carryOverDiff = adjustedMaxBalance.subtract(adjustedMaxCarryOver);
177
178 if(StringUtils.equals(accrualRule.getActionAtMaxBalance(),LMConstants.ACTION_AT_MAX_BAL.LOSE)){
179 //add carry over excess to forfeiture.
180 bt.setForfeitedAmount(bt.getForfeitedAmount().add(carryOverDiff));
181 }
182 else {
183 //maximize the transfer amount.
184 BigDecimal potentialTransferAmount = bt.getTransferAmount().add(carryOverDiff);
185
186 //Can this amount be added to the transfer amount without exceeding adjusted max transfer amount??
187 if(potentialTransferAmount.compareTo(adjustedMaxTransferAmount) <= 0) {
188 //yes
189 bt.setTransferAmount(bt.getTransferAmount().add(carryOverDiff));
190 }
191 else {
192 //no
193 BigDecimal carryOverExcess = potentialTransferAmount.subtract(adjustedMaxTransferAmount);
194 //move excess to forfeiture
195 bt.setForfeitedAmount(bt.getForfeitedAmount().add(carryOverExcess));
196 //the remainder (if any) can be added to the transfer amount.
197 bt.setTransferAmount(bt.getTransferAmount().add(carryOverDiff.subtract(carryOverExcess)));
198
199 assert(bt.getTransferAmount().compareTo(adjustedMaxTransferAmount)==0);
200 // assert that the new balance will be equal to the adjusted max carry over < adjusted max balance.
201 }
202 }
203 assert(adjustedMaxCarryOver.compareTo(accruedBalance.subtract(bt.getTransferAmount().add(bt.getForfeitedAmount()))) == 0);
204 }
205 //otherwise, given balance will be at or under the max annual carry over.
206 }
207
208 bt.setEffectiveDate(effectiveDate);
209 bt.setAccrualCategoryRule(accrualCategoryRule);
210 bt.setFromAccrualCategory(fromAccrualCategory.getAccrualCategory());
211 bt.setPrincipalId(principalId);
212 if(ObjectUtils.isNotNull(transferConversionFactor))
213 bt.setAmountTransferred(bt.getTransferAmount().multiply(transferConversionFactor).setScale(2));
214 else
215 bt.setAmountTransferred(bt.getTransferAmount());
216 }
217 return bt;
218 }
219
220 @Override
221 public BalanceTransfer transfer(BalanceTransfer balanceTransfer) {
222 if(ObjectUtils.isNull(balanceTransfer))
223 throw new RuntimeException("did not supply a valid BalanceTransfer object.");
224 else {
225 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>();
226 BigDecimal transferAmount = balanceTransfer.getTransferAmount();
227 LeaveBlock aLeaveBlock = null;
228
229 if(ObjectUtils.isNotNull(balanceTransfer.getAmountTransferred())) {
230 if(balanceTransfer.getAmountTransferred().compareTo(BigDecimal.ZERO) > 0 ) {
231
232 aLeaveBlock = new LeaveBlock();
233 //Create a leave block that adds the adjusted transfer amount to the "transfer to" accrual category.
234 aLeaveBlock.setPrincipalId(balanceTransfer.getPrincipalId());
235 aLeaveBlock.setLeaveDate(balanceTransfer.getEffectiveDate());
236 aLeaveBlock.setEarnCode(balanceTransfer.getCreditedAccrualCategory().getEarnCode());
237 aLeaveBlock.setAccrualCategory(balanceTransfer.getToAccrualCategory());
238 aLeaveBlock.setDescription("Amount transferred");
239 aLeaveBlock.setLeaveAmount(balanceTransfer.getAmountTransferred());
240 aLeaveBlock.setAccrualGenerated(true);
241 aLeaveBlock.setTransactionDocId(balanceTransfer.getDocumentHeaderId());
242 aLeaveBlock.setLeaveBlockType(LMConstants.LEAVE_BLOCK_TYPE.BALANCE_TRANSFER);
243 aLeaveBlock.setDocumentId(balanceTransfer.getLeaveCalendarDocumentId());
244 aLeaveBlock.setRequestStatus(LMConstants.REQUEST_STATUS.REQUESTED);
245 aLeaveBlock.setBlockId(0L);
246
247 //Want to store the newly created leave block id on this maintainable object
248 //when the status of the maintenance document encapsulating this maintainable changes
249 //the id will be used to fetch and update the leave block statuses.
250 aLeaveBlock = KRADServiceLocator.getBusinessObjectService().save(aLeaveBlock);
251
252 balanceTransfer.setAccruedLeaveBlockId(aLeaveBlock.getLmLeaveBlockId());
253 // save history
254 LeaveBlockHistory lbh = new LeaveBlockHistory(aLeaveBlock);
255 lbh.setAction(LMConstants.ACTION.ADD);
256 TkServiceLocator.getLeaveBlockHistoryService().saveLeaveBlockHistory(lbh);
257 leaveBlocks.add(aLeaveBlock);
258 }
259 }
260
261 if(ObjectUtils.isNotNull(transferAmount)) {
262 if(transferAmount.compareTo(BigDecimal.ZERO) > 0) {
263 //Create leave block that removes the correct transfer amount from the originating accrual category.
264 aLeaveBlock = new LeaveBlock();
265 aLeaveBlock.setPrincipalId(balanceTransfer.getPrincipalId());
266 aLeaveBlock.setLeaveDate(balanceTransfer.getEffectiveDate());
267 aLeaveBlock.setEarnCode(balanceTransfer.getDebitedAccrualCategory().getEarnCode());
268 aLeaveBlock.setAccrualCategory(balanceTransfer.getFromAccrualCategory());
269 aLeaveBlock.setDescription("Transferred amount");
270 aLeaveBlock.setLeaveAmount(balanceTransfer.getTransferAmount().negate());
271 aLeaveBlock.setAccrualGenerated(true);
272 aLeaveBlock.setTransactionDocId(balanceTransfer.getDocumentHeaderId());
273 aLeaveBlock.setLeaveBlockType(LMConstants.LEAVE_BLOCK_TYPE.BALANCE_TRANSFER);
274 aLeaveBlock.setRequestStatus(LMConstants.REQUEST_STATUS.REQUESTED);
275 aLeaveBlock.setDocumentId(balanceTransfer.getLeaveCalendarDocumentId());
276 aLeaveBlock.setBlockId(0L);
277
278 //Want to store the newly created leave block id on this maintainable object.
279 //when the status of the maintenance document encapsulating this maintainable changes
280 //the id will be used to fetch and update the leave block statuses.
281 aLeaveBlock = KRADServiceLocator.getBusinessObjectService().save(aLeaveBlock);
282
283 balanceTransfer.setDebitedLeaveBlockId(aLeaveBlock.getLmLeaveBlockId());
284 // save history
285 LeaveBlockHistory lbh = new LeaveBlockHistory(aLeaveBlock);
286 lbh.setAction(LMConstants.ACTION.ADD);
287 TkServiceLocator.getLeaveBlockHistoryService().saveLeaveBlockHistory(lbh);
288
289 leaveBlocks.add(aLeaveBlock);
290 }
291 }
292
293 BigDecimal forfeitedAmount = balanceTransfer.getForfeitedAmount();
294 if(ObjectUtils.isNotNull(forfeitedAmount)) {
295 //Any amount forfeited must come out of the originating accrual category in order to bring balance back to max.
296 if(forfeitedAmount.compareTo(BigDecimal.ZERO) > 0) {
297 //for balance transfers with action = lose, transfer amount must be moved to forfeitedAmount
298 aLeaveBlock = new LeaveBlock();
299 aLeaveBlock.setPrincipalId(balanceTransfer.getPrincipalId());
300 aLeaveBlock.setLeaveDate(balanceTransfer.getEffectiveDate());
301 aLeaveBlock.setEarnCode(balanceTransfer.getDebitedAccrualCategory().getEarnCode());
302 aLeaveBlock.setAccrualCategory(balanceTransfer.getFromAccrualCategory());
303 aLeaveBlock.setDescription("Forfeited balance transfer amount");
304 aLeaveBlock.setLeaveAmount(forfeitedAmount.negate());
305 aLeaveBlock.setAccrualGenerated(true);
306 aLeaveBlock.setTransactionDocId(balanceTransfer.getDocumentHeaderId());
307 aLeaveBlock.setLeaveBlockType(LMConstants.LEAVE_BLOCK_TYPE.BALANCE_TRANSFER);
308 aLeaveBlock.setRequestStatus(LMConstants.REQUEST_STATUS.REQUESTED);
309 aLeaveBlock.setDocumentId(balanceTransfer.getLeaveCalendarDocumentId());
310 aLeaveBlock.setBlockId(0L);
311
312 //Want to store the newly created leave block id on this maintainable object
313 //when the status of the maintenance document encapsulating this maintainable changes
314 //the id will be used to fetch and update the leave block statuses.
315 aLeaveBlock = KRADServiceLocator.getBusinessObjectService().save(aLeaveBlock);
316
317 balanceTransfer.setForfeitedLeaveBlockId(aLeaveBlock.getLmLeaveBlockId());
318 // save history
319 LeaveBlockHistory lbh = new LeaveBlockHistory(aLeaveBlock);
320 lbh.setAction(LMConstants.ACTION.ADD);
321 TkServiceLocator.getLeaveBlockHistoryService().saveLeaveBlockHistory(lbh);
322
323 leaveBlocks.add(aLeaveBlock);
324 }
325 }
326
327 return balanceTransfer;
328 }
329 }
330
331 public BalanceTransferDao getBalanceTransferDao() {
332 return balanceTransferDao;
333 }
334
335 public void setBalanceTransferDao(BalanceTransferDao balanceTransferDao) {
336 this.balanceTransferDao = balanceTransferDao;
337 }
338
339 @Override
340 public void submitToWorkflow(BalanceTransfer balanceTransfer)
341 throws WorkflowException {
342
343 //balanceTransfer.setStatus(TkConstants.ROUTE_STATUS.ENROUTE);
344 EntityNamePrincipalName principalName = null;
345 if (balanceTransfer.getPrincipalId() != null) {
346 principalName = KimApiServiceLocator.getIdentityService().getDefaultNamesForPrincipalId(balanceTransfer.getPrincipalId());
347 }
348
349 MaintenanceDocument document = KRADServiceLocatorWeb.getMaintenanceDocumentService().setupNewMaintenanceDocument(BalanceTransfer.class.getName(),
350 "BalanceTransferDocumentType",KRADConstants.MAINTENANCE_NEW_ACTION);
351
352 String personName = (principalName != null && principalName.getDefaultName() != null) ? principalName.getDefaultName().getCompositeName() : StringUtils.EMPTY;
353 String date = TKUtils.formatDate(new java.sql.Date(balanceTransfer.getEffectiveDate().getTime()));
354 document.getDocumentHeader().setDocumentDescription(personName + " (" + balanceTransfer.getPrincipalId() + ") - " + date);
355 Map<String,String[]> params = new HashMap<String,String[]>();
356
357 KRADServiceLocatorWeb.getMaintenanceDocumentService().setupMaintenanceObject(document, KRADConstants.MAINTENANCE_NEW_ACTION, params);
358 BalanceTransfer btObj = (BalanceTransfer) document.getNewMaintainableObject().getDataObject();
359
360 btObj.setAccrualCategoryRule(balanceTransfer.getAccrualCategoryRule());
361 btObj.setEffectiveDate(balanceTransfer.getEffectiveDate());
362 btObj.setForfeitedAmount(balanceTransfer.getForfeitedAmount());
363 btObj.setFromAccrualCategory(balanceTransfer.getFromAccrualCategory());
364 btObj.setPrincipalId(balanceTransfer.getPrincipalId());
365 btObj.setToAccrualCategory(balanceTransfer.getToAccrualCategory());
366 btObj.setTransferAmount(balanceTransfer.getTransferAmount());
367 btObj.setAmountTransferred(balanceTransfer.getAmountTransferred());
368 btObj.setLeaveCalendarDocumentId(balanceTransfer.getLeaveCalendarDocumentId());
369 btObj.setSstoId(balanceTransfer.getSstoId());
370 btObj.setDocumentHeaderId(document.getDocumentHeader().getWorkflowDocument().getDocumentId());
371 /* TkServiceLocator.getBalanceTransferService().saveOrUpdate(btObj);
372 document.getNewMaintainableObject().setDataObject(btObj);*/
373 KRADServiceLocatorWeb.getDocumentService().saveDocument(document);
374 document.getDocumentHeader().getWorkflowDocument().saveDocument("");
375
376 document.getDocumentHeader().getWorkflowDocument().route("");
377
378 }
379
380 @Override
381 public BalanceTransfer transferSsto(BalanceTransfer balanceTransfer) {
382 if(ObjectUtils.isNull(balanceTransfer))
383 throw new RuntimeException("did not supply a valid BalanceTransfer object.");
384 else {
385 List<LeaveBlock> sstoLbList = TkServiceLocator.getLeaveBlockService().getSSTOLeaveBlocks(balanceTransfer.getPrincipalId(), balanceTransfer.getSstoId(), balanceTransfer.getEffectiveDate());
386 String leaveDocId = "";
387 if(CollectionUtils.isNotEmpty(sstoLbList)) {
388 leaveDocId = sstoLbList.get(0).getDocumentId();
389 }
390 List<LeaveBlock> lbList = new ArrayList<LeaveBlock>();
391 // create a new leave block with transferred amount, make sure system scheduled timeoff id is added to it
392 LeaveBlock aLeaveBlock = new LeaveBlock();
393 aLeaveBlock.setPrincipalId(balanceTransfer.getPrincipalId());
394 aLeaveBlock.setLeaveDate(balanceTransfer.getEffectiveDate());
395 aLeaveBlock.setEarnCode(balanceTransfer.getCreditedAccrualCategory().getEarnCode());
396 aLeaveBlock.setAccrualCategory(balanceTransfer.getToAccrualCategory());
397 aLeaveBlock.setDescription("System Scheduled Time off Amount transferred");
398 aLeaveBlock.setLeaveAmount(balanceTransfer.getAmountTransferred());
399 aLeaveBlock.setAccrualGenerated(false);
400 aLeaveBlock.setLeaveBlockType(LMConstants.LEAVE_BLOCK_TYPE.BALANCE_TRANSFER);
401 aLeaveBlock.setRequestStatus(LMConstants.REQUEST_STATUS.REQUESTED);
402 aLeaveBlock.setBlockId(0L);
403 aLeaveBlock.setScheduleTimeOffId(balanceTransfer.getSstoId());
404 aLeaveBlock.setDocumentId(leaveDocId);
405
406 lbList.add(aLeaveBlock);
407 TkServiceLocator.getLeaveBlockService().saveLeaveBlocks(lbList);
408
409 balanceTransfer.setAccruedLeaveBlockId(aLeaveBlock.getLmLeaveBlockId());
410 return balanceTransfer;
411 }
412 }
413
414 @Override
415 public List<BalanceTransfer> getBalanceTransfers(String viewPrincipal,
416 Date beginPeriodDate, Date endPeriodDate) {
417 // TODO Auto-generated method stub
418 return balanceTransferDao.getBalanceTransfers(viewPrincipal, beginPeriodDate, endPeriodDate);
419 }
420
421 @Override
422 public void saveOrUpdate(BalanceTransfer balanceTransfer) {
423 // TODO Auto-generated method stub
424 balanceTransferDao.saveOrUpdate(balanceTransfer);
425 }
426 }