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.leavepayout.service;
017
018 import org.apache.commons.collections.CollectionUtils;
019 import org.kuali.hr.lm.LMConstants;
020 import org.kuali.hr.lm.balancetransfer.BalanceTransfer;
021 import org.kuali.hr.lm.leavepayout.LeavePayout;
022 import org.kuali.hr.lm.leaveblock.LeaveBlock;
023 import org.kuali.hr.time.HrBusinessObject;
024 import org.kuali.hr.time.service.base.TkServiceLocator;
025 import org.kuali.hr.time.util.HrBusinessObjectMaintainableImpl;
026 import org.kuali.rice.kew.api.document.DocumentStatus;
027 import org.kuali.rice.kew.api.exception.WorkflowException;
028 import org.kuali.rice.kns.document.MaintenanceDocument;
029 import org.kuali.rice.krad.bo.DocumentHeader;
030 import org.kuali.rice.krad.service.DocumentService;
031 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
032 import org.kuali.rice.krad.util.ObjectUtils;
033
034 public class LeavePayoutMaintainableImpl extends
035 HrBusinessObjectMaintainableImpl {
036
037 private static final long serialVersionUID = 1L;
038
039 @Override
040 public void saveBusinessObject() {
041 LeavePayout bt = (LeavePayout) this.getBusinessObject();
042
043 LeavePayout existingBt = TkServiceLocator.getLeavePayoutService().getLeavePayoutById(bt.getId());
044
045 if(ObjectUtils.isNotNull(existingBt)) {
046 if(existingBt.getPayoutAmount().compareTo(bt.getPayoutAmount()) != 0) {
047 //TODO: Create leave block reference within bt, and update leave amount.
048 }
049 if(existingBt.getForfeitedAmount().compareTo(bt.getForfeitedAmount()) != 0) {
050 //TODO: Create reference within bt for forfeited leave block, update leave amount.
051 }
052 //Will approvers / department admins be changing accrual category? effective date?
053 }
054 }
055
056 @Override
057 public HrBusinessObject getObjectById(String id) {
058 // TODO Auto-generated method stub
059 return TkServiceLocator.getLeavePayoutService().getLeavePayoutById(id);
060 }
061
062 @Override
063 public void doRouteStatusChange(DocumentHeader documentHeader) {
064 //ProcessDocReport pdr = new ProcessDocReport(true, "");
065 String documentId = documentHeader.getDocumentNumber();
066 LeavePayout payout = (LeavePayout)this.getDataObject();
067 DocumentService documentService = KRADServiceLocatorWeb.getDocumentService();
068
069 DocumentStatus newDocumentStatus = documentHeader.getWorkflowDocument().getStatus();
070 String routedByPrincipalId = documentHeader.getWorkflowDocument().getRoutedByPrincipalId();
071 if (DocumentStatus.ENROUTE.equals(newDocumentStatus)
072 && CollectionUtils.isEmpty(payout.getLeaveBlocks())) {
073 //when payout document is routed, initiate the leave payout - creating the leave blocks
074 try {
075 MaintenanceDocument md = (MaintenanceDocument)KRADServiceLocatorWeb.getDocumentService().getByDocumentHeaderId(documentId);
076
077 payout = TkServiceLocator.getLeavePayoutService().payout(payout);
078 md.getNewMaintainableObject().setDataObject(payout);
079 documentService.saveDocument(md);
080 }
081 catch (WorkflowException e) {
082 LOG.error("caught exception while handling doRouteStatusChange -> documentService.getByDocumentHeaderId(" + documentHeader.getDocumentNumber() + "). ", e);
083 throw new RuntimeException("caught exception while handling doRouteStatusChange -> documentService.getByDocumentHeaderId(" + documentHeader.getDocumentNumber() + "). ", e);
084 }
085 } else if (DocumentStatus.DISAPPROVED.equals(newDocumentStatus)) {
086 //When payout document is disapproved, set all leave block's request statuses to disapproved.
087 for(LeaveBlock lb : payout.getLeaveBlocks()) {
088 if(ObjectUtils.isNotNull(lb)) {
089 lb.setRequestStatus(LMConstants.REQUEST_STATUS.DISAPPROVED);
090 TkServiceLocator.getLeaveBlockService().deleteLeaveBlock(lb.getLmLeaveBlockId(), routedByPrincipalId);
091 }
092 }
093 //update status of document and associated leave blocks.
094 } else if (DocumentStatus.FINAL.equals(newDocumentStatus)) {
095 //When payout document moves to final, set all leave block's request statuses to approved.
096 for(LeaveBlock lb : payout.getLeaveBlocks()) {
097 if(ObjectUtils.isNotNull(lb)) {
098 lb.setRequestStatus(LMConstants.REQUEST_STATUS.APPROVED);
099 TkServiceLocator.getLeaveBlockService().updateLeaveBlock(lb, routedByPrincipalId);
100 }
101 }
102 } else if (DocumentStatus.CANCELED.equals(newDocumentStatus)) {
103 //When payout document is canceled, set all leave block's request statuses to deferred
104 for(LeaveBlock lb : payout.getLeaveBlocks()) {
105 if(ObjectUtils.isNotNull(lb)) {
106 lb.setRequestStatus(LMConstants.REQUEST_STATUS.DEFERRED);
107 TkServiceLocator.getLeaveBlockService().updateLeaveBlock(lb, routedByPrincipalId);
108 }
109 }
110 }
111 }
112
113 }