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;
017
018 import java.math.BigDecimal;
019 import java.sql.Date;
020 import java.util.ArrayList;
021 import java.util.List;
022
023 import org.kuali.hr.lm.accrual.AccrualCategory;
024 import org.kuali.hr.lm.accrual.AccrualCategoryRule;
025 import org.kuali.hr.lm.leaveblock.LeaveBlock;
026 import org.kuali.hr.time.HrBusinessObject;
027 import org.kuali.hr.time.service.base.TkServiceLocator;
028 import org.kuali.hr.time.util.TkConstants;
029 import org.kuali.rice.kim.api.identity.Person;
030 import org.kuali.rice.krad.util.ObjectUtils;
031
032 public class BalanceTransfer extends HrBusinessObject {
033
034 private static final long serialVersionUID = 6948695780968441016L;
035
036 private String balanceTransferId;
037 private String documentHeaderId;
038 private String accrualCategoryRule;
039 private String principalId;
040 private String toAccrualCategory;
041 private String fromAccrualCategory;
042 private BigDecimal transferAmount;
043 private BigDecimal amountTransferred;
044 private BigDecimal forfeitedAmount;
045 private String leaveCalendarDocumentId;
046
047 private String status;
048 private String forfeitedLeaveBlockId;
049 private String accruedLeaveBlockId;
050 private String debitedLeaveBlockId;
051 private String sstoId;
052
053 private transient Person principal;
054
055 public String getPrincipalId() {
056 return principalId;
057 }
058
059 public void setPrincipalId(String principalId) {
060 this.principalId = principalId;
061 }
062
063 public String getToAccrualCategory() {
064 return toAccrualCategory;
065 }
066
067 public void setToAccrualCategory(String toAccrualCategory) {
068 this.toAccrualCategory = toAccrualCategory;
069 }
070
071 public String getFromAccrualCategory() {
072 return fromAccrualCategory;
073 }
074
075 public void setFromAccrualCategory(String fromAccrualCategory) {
076 this.fromAccrualCategory = fromAccrualCategory;
077 }
078
079 public BigDecimal getTransferAmount() {
080 return transferAmount;
081 }
082
083 public void setTransferAmount(BigDecimal transferAmount) {
084 this.transferAmount = transferAmount;
085 }
086
087 public BigDecimal getForfeitedAmount() {
088 return forfeitedAmount;
089 }
090
091 public void setForfeitedAmount(BigDecimal forfeitedAmount) {
092 this.forfeitedAmount = forfeitedAmount;
093 }
094
095 public String getBalanceTransferId() {
096 return balanceTransferId;
097 }
098
099 public void setBalanceTransferId(String balanceTransferId) {
100 this.balanceTransferId = balanceTransferId;
101 }
102
103 public String getAccrualCategoryRule() {
104 return accrualCategoryRule;
105 }
106
107 public void setAccrualCategoryRule(String accrualCategoryRule) {
108 this.accrualCategoryRule = accrualCategoryRule;
109 }
110
111 @Override
112 protected String getUniqueKey() {
113 return balanceTransferId;
114 }
115
116 @Override
117 public String getId() {
118 return getBalanceTransferId();
119 }
120
121 @Override
122 public void setId(String id) {
123 setBalanceTransferId(id);
124 }
125
126 public Person getPrincipal() {
127 return principal;
128 }
129
130 public void setPrincipal(Person principal) {
131 this.principal = principal;
132 }
133
134 public AccrualCategory getCreditedAccrualCategory() {
135 return TkServiceLocator.getAccrualCategoryService().getAccrualCategory(toAccrualCategory, super.getEffectiveDate());
136 }
137
138 public AccrualCategory getDebitedAccrualCategory() {
139 return TkServiceLocator.getAccrualCategoryService().getAccrualCategory(fromAccrualCategory, super.getEffectiveDate());
140 }
141
142 public String getLeaveCalendarDocumentId() {
143 return leaveCalendarDocumentId;
144 }
145
146 public void setLeaveCalendarDocumentId(String leaveCalendarDocumentId) {
147 this.leaveCalendarDocumentId = leaveCalendarDocumentId;
148 }
149
150 /**
151 * Returns a balance transfer object adjusted for the new transfer amount.
152 *
153 * "this" must be a default initialized balance transfer. i.e. transfer amount plus forfeited amount
154 * equal to the amount of leave in excess of the from accrual category's max balance for the given principal.
155 *
156 * calling this method without first validating the supplied transfer amount via BalanceTransferValidationUtils may produce undesired results.
157 *
158 * @param transferAmount The desired transfer amount
159 * @return A balance transfer object with forfeited and amount transfer amounts adjusted to transferAmount
160 */
161 public BalanceTransfer adjust(BigDecimal transferAmount) {
162 BigDecimal difference = this.transferAmount.subtract(transferAmount);
163 AccrualCategoryRule aRule = TkServiceLocator.getAccrualCategoryRuleService().getAccrualCategoryRule(accrualCategoryRule);
164 //technically if there is forfeiture, then the transfer amount has already been maximized
165 //via BalanceTransferService::initializeTransfer(...)
166 //i.o.w. transfer amount cannot be increased.
167 //this method is written with the intention of eventually allowing end user to adjust the transfer
168 //amount as many times as they wish before submitting. Currently they cannot.
169 if(difference.signum() < 0) {
170 //transfer amount is being increased.
171 if(forfeitedAmount.compareTo(BigDecimal.ZERO) > 0) {
172 //transfer amount has already been maximized.
173 if(forfeitedAmount.compareTo(difference.abs()) >= 0)
174 // there is enough leave in the forfeited amount to take out the difference.
175 forfeitedAmount = forfeitedAmount.subtract(difference.abs());
176 else
177 // the difference zero's the forfeited amount.
178 forfeitedAmount = BigDecimal.ZERO;
179 }
180 // a forfeited amount equal to zero with an increase in the transfer amount
181 // does not produce forfeiture.
182 // forfeiture cannot be negative.
183 }
184 else if (difference.signum() > 0) {
185 //transfer amount is being decreased
186 forfeitedAmount = forfeitedAmount.add(difference);
187 }
188
189 this.transferAmount = transferAmount;
190
191 if(ObjectUtils.isNotNull(aRule.getMaxBalanceTransferConversionFactor()))
192 this.amountTransferred = transferAmount.multiply(aRule.getMaxBalanceTransferConversionFactor()).setScale(2);
193 else
194 this.amountTransferred = transferAmount;
195
196 return this;
197 }
198
199 public List<LeaveBlock> getLeaveBlocks() {
200 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>();
201 if (getForfeitedLeaveBlockId() != null) {
202 leaveBlocks.add(TkServiceLocator.getLeaveBlockService().getLeaveBlock(forfeitedLeaveBlockId));
203 }
204 if (getAccruedLeaveBlockId() != null) {
205 leaveBlocks.add(TkServiceLocator.getLeaveBlockService().getLeaveBlock(accruedLeaveBlockId));
206 }
207 if (getDebitedLeaveBlockId() != null) {
208 leaveBlocks.add(TkServiceLocator.getLeaveBlockService().getLeaveBlock(debitedLeaveBlockId));
209 }
210
211 return leaveBlocks;
212 }
213
214 public String getStatus() {
215 return status;
216 }
217
218 public void setStatus(String status) {
219 this.status = status;
220 }
221
222 public void disapprove() {
223 TkServiceLocator.getLeaveBlockService().updateLeaveBlock(null, principalId);
224 setStatus(TkConstants.ROUTE_STATUS.DISAPPROVED);
225 }
226
227 public void approve() {
228
229 setStatus(TkConstants.ROUTE_STATUS.FINAL);
230 }
231
232 public void cancel() {
233
234 setStatus(TkConstants.ROUTE_STATUS.CANCEL);
235 }
236
237 public String getAccruedLeaveBlockId() {
238 return accruedLeaveBlockId;
239 }
240
241 public void setAccruedLeaveBlockId(String accruedLeaveBlockId) {
242 this.accruedLeaveBlockId = accruedLeaveBlockId;
243 }
244
245 public String getForfeitedLeaveBlockId() {
246 return forfeitedLeaveBlockId;
247 }
248
249 public void setForfeitedLeaveBlockId(String forfeitedLeaveBlockId) {
250 this.forfeitedLeaveBlockId = forfeitedLeaveBlockId;
251 }
252
253 public String getDebitedLeaveBlockId() {
254 return debitedLeaveBlockId;
255 }
256
257 public void setDebitedLeaveBlockId(String debitedLeaveBlockId) {
258 this.debitedLeaveBlockId = debitedLeaveBlockId;
259 }
260
261 public BigDecimal getAmountTransferred() {
262 return amountTransferred;
263 }
264
265 public void setAmountTransferred(BigDecimal amountTransferrerd) {
266 this.amountTransferred = amountTransferrerd;
267 }
268
269 public String getSstoId() {
270 return sstoId;
271 }
272
273 public void setSstoId(String sstoId) {
274 this.sstoId = sstoId;
275 }
276
277 public String getDocumentHeaderId() {
278 return documentHeaderId;
279 }
280
281 public void setDocumentHeaderId(String documentHeaderId) {
282 this.documentHeaderId = documentHeaderId;
283 }
284
285 //Comparable for order handling of more than one transfer occurring during the same
286 //action frequency interval?
287
288 }