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;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.hr.lm.accrual.AccrualCategory;
020    import org.kuali.hr.lm.accrual.AccrualCategoryRule;
021    import org.kuali.hr.lm.leaveblock.LeaveBlock;
022    import org.kuali.hr.time.HrBusinessObject;
023    import org.kuali.hr.time.earncode.EarnCode;
024    import org.kuali.hr.time.principal.PrincipalHRAttributes;
025    import org.kuali.hr.time.service.base.TkServiceLocator;
026    import org.kuali.rice.kim.api.identity.Person;
027    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
028    import org.kuali.rice.krad.util.ObjectUtils;
029    
030    import java.math.BigDecimal;
031    import java.util.ArrayList;
032    import java.util.List;
033    
034    public class LeavePayout extends HrBusinessObject {
035    
036            private static final long serialVersionUID = 1L;
037    
038            private String lmLeavePayoutId;
039            private String principalId;
040            private String documentHeaderId;
041            private String fromAccrualCategory;
042            private String earnCode;
043            private String description;
044            private BigDecimal payoutAmount = new BigDecimal("0.0");
045        private BigDecimal forfeitedAmount = new BigDecimal("0.0");
046            private Person principal;
047            private AccrualCategory fromAccrualCategoryObj;
048            private EarnCode earnCodeObj;
049            private PrincipalHRAttributes principalHRAttrObj;
050        private String leaveCalendarDocumentId;
051        private String accrualCategoryRule;
052        private String forfeitedLeaveBlockId;
053        private String payoutFromLeaveBlockId;
054        private String payoutLeaveBlockId;
055    
056            private String status;
057    
058            public String getEarnCode() {
059                    return earnCode;
060            }
061            public void setEarnCode(String earnCode) {
062                    this.earnCode = earnCode;
063            }
064            public EarnCode getEarnCodeObj() {
065                    return TkServiceLocator.getEarnCodeService().getEarnCode(earnCode, getEffectiveDate());
066            }
067            public void setEarnCodeObj(EarnCode earnCodeObj) {
068                    this.earnCodeObj = earnCodeObj;
069            }
070            public String getPrincipalId() {
071                    return principalId;
072            }
073            public void setPrincipalId(String principalId) {
074                    this.principalId = principalId;
075            }
076        public Person getPrincipal() {
077            return principal;
078        }
079        public void setPrincipal(Person principal) {
080            this.principal = principal;
081        }
082            public String getName() {
083                    if (principal == null) {
084            principal = KimApiServiceLocator.getPersonService().getPerson(this.principalId);
085                    }
086                    return (principal != null) ? principal.getName() : "";
087            }
088            
089            public String getLeavePlan() {
090                    if (!StringUtils.isEmpty(this.principalId)) {
091                            principalHRAttrObj = TkServiceLocator.getPrincipalHRAttributeService().getPrincipalCalendar(principalId, this.getEffectiveDate());
092                    }
093                    return (principalHRAttrObj != null) ? principalHRAttrObj.getLeavePlan() : "";
094            }
095    
096            public void setLeavePlan(String leavePlan) {
097            }
098            public String getFromAccrualCategory() {
099                    return fromAccrualCategory;
100            }
101            public void setFromAccrualCategory(String accrualCategory) {
102                    this.fromAccrualCategory = accrualCategory;
103            }
104            
105            public String getDescription() {
106                    return description;
107            }
108            public void setDescription(String description) {
109                    this.description = description;
110            }
111            public BigDecimal getPayoutAmount() {
112                    return payoutAmount;
113            }
114            public void setPayoutAmount(BigDecimal amount) {
115                    this.payoutAmount = amount;
116            }
117        public BigDecimal getForfeitedAmount() {
118            return forfeitedAmount;
119        }
120        public void setForfeitedAmount(BigDecimal amount) {
121            this.forfeitedAmount = amount;
122        }
123            public AccrualCategory getFromAccrualCategoryObj() {
124                    return TkServiceLocator.getAccrualCategoryService().getAccrualCategory(fromAccrualCategory, getEffectiveDate());
125            }
126            public void setFromAccrualCategoryObj(AccrualCategory accrualCategoryObj) {
127                    this.fromAccrualCategoryObj = accrualCategoryObj;
128            }
129            public static long getSerialversionuid() {
130                    return serialVersionUID;
131            }
132            public String getLmLeavePayoutId() {
133                    return lmLeavePayoutId;
134            }
135            public void setLmLeavePayoutId(String id) {
136                    this.lmLeavePayoutId = id;
137            }
138            
139            @Override
140            protected String getUniqueKey() {
141                    return getLmLeavePayoutId();
142            }
143            
144            @Override
145            public String getId() {
146                    return getLmLeavePayoutId();
147            }
148    
149            @Override
150            public void setId(String id) {
151                    setLmLeavePayoutId(id);
152            }
153    
154            public PrincipalHRAttributes getPrincipalHRAttrObj() {
155                    return principalHRAttrObj;
156            }
157            public void setPrincipalHRAttrObj(PrincipalHRAttributes hrObj) {
158                    this.principalHRAttrObj = hrObj;
159            }
160            public String getAccrualCategoryRule() {
161                    return accrualCategoryRule;
162            }
163            public void setAccrualCategoryRule(String accrualCategoryRule) {
164                    this.accrualCategoryRule = accrualCategoryRule;
165            }
166            public String getForfeitedLeaveBlockId() {
167                    return forfeitedLeaveBlockId;
168            }
169            public void setForfeitedLeaveBlockId(String forfeitedLeaveBlockId) {
170                    this.forfeitedLeaveBlockId = forfeitedLeaveBlockId;
171            }
172            public String getPayoutLeaveBlockId() {
173                    return payoutLeaveBlockId;
174            }
175            public void setPayoutLeaveBlockId(String payoutLeaveBlockId) {
176                    this.payoutLeaveBlockId = payoutLeaveBlockId;
177            }
178            public String getPayoutFromLeaveBlockId() {
179                    return payoutFromLeaveBlockId;
180            }
181            public void setPayoutFromLeaveBlockId(String payoutFromLeaveBlockId) {
182                    this.payoutFromLeaveBlockId = payoutFromLeaveBlockId;
183            }
184    
185            public void setLeaveCalendarDocumentId(String leaveCalendarDocumentId) {
186                    this.leaveCalendarDocumentId = leaveCalendarDocumentId;
187            }
188    
189        public List<LeaveBlock> getLeaveBlocks() {
190            List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>();
191    
192                    if (getForfeitedLeaveBlockId() != null) {
193                        leaveBlocks.add(TkServiceLocator.getLeaveBlockService().getLeaveBlock(forfeitedLeaveBlockId));
194            }
195            if (getPayoutFromLeaveBlockId() != null) {
196                        leaveBlocks.add(TkServiceLocator.getLeaveBlockService().getLeaveBlock(payoutFromLeaveBlockId));
197            }
198            if (getPayoutLeaveBlockId() != null) {
199                        leaveBlocks.add(TkServiceLocator.getLeaveBlockService().getLeaveBlock(payoutLeaveBlockId));
200            }
201            return leaveBlocks;
202        }
203    
204        public String getLeaveCalendarDocumentId() {
205            return leaveCalendarDocumentId;
206        }
207            public LeavePayout adjust(BigDecimal payoutAmount) {
208                    BigDecimal difference = this.payoutAmount.subtract(payoutAmount);
209                    //technically if there is forfeiture, then the transfer amount has already been maximized
210                    //via BalanceTransferService::initializeTransfer(...)
211                    //i.o.w. transfer amount cannot be increased.
212                    //this method is written with the intention of eventually allowing end user to adjust the transfer
213                    //amount as many times as they wish before submitting. Currently they cannot.
214                    if(difference.signum() < 0) {
215                            //transfer amount is being increased.
216                            if(forfeitedAmount.compareTo(BigDecimal.ZERO) > 0) {
217                                    //transfer amount has already been maximized.
218                                    if(forfeitedAmount.compareTo(difference.abs()) >= 0)
219                                            // there is enough leave in the forfeited amount to take out the difference.
220                                            forfeitedAmount = forfeitedAmount.subtract(difference.abs());
221                                    else
222                                            // the difference zero's the forfeited amount.
223                                            forfeitedAmount = BigDecimal.ZERO;
224                            }
225                            // a forfeited amount equal to zero with an increase in the transfer amount
226                            // does not produce forfeiture.
227                            // forfeiture cannot be negative.
228                    }
229                    else if (difference.signum() > 0) {
230                            //transfer amount is being decreased
231                            forfeitedAmount = forfeitedAmount.add(difference);
232                    }
233    
234                    this.payoutAmount = payoutAmount;
235                    
236                    return this;
237            }
238            
239            public String getStatus() {
240                    return status;
241            }
242            
243            public void setStatus(String code) {
244                    status = code;
245            }
246            public String getDocumentHeaderId() {
247                    return documentHeaderId;
248            }
249            public void setDocumentHeaderId(String documentHeaderId) {
250                    this.documentHeaderId = documentHeaderId;
251            }
252    }