001 /** 002 * Copyright 2005-2014 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 edu.sampleu.travel.approval.dataobject; 017 018 import org.kuali.rice.krad.bo.PersistableBusinessObjectBase; 019 import java.sql.Timestamp; 020 import java.util.LinkedHashMap; 021 import javax.persistence.Column; 022 import javax.persistence.Entity; 023 import javax.persistence.GeneratedValue; 024 import javax.persistence.Id; 025 import javax.persistence.JoinColumn; 026 import javax.persistence.ManyToOne; 027 import javax.persistence.SequenceGenerator; 028 import javax.persistence.Table; 029 import org.kuali.rice.krad.util.KRADPropertyConstants; 030 //import org.kuali.kfs.module.tem.TemConstants.TravelParameters; 031 //import org.kuali.kfs.sys.KFSConstants; 032 //import org.kuali.kfs.sys.context.SpringContext; 033 //import org.kuali.rice.kns.service.ParameterService; 034 import org.kuali.rice.core.api.util.type.KualiDecimal; 035 import org.kuali.rice.krad.util.ObjectUtils; 036 037 @Entity 038 @Table(name="TRVL_PER_DIEM_EXP_T") 039 public class PerDiemExpense extends PersistableBusinessObjectBase { 040 041 @Id 042 @GeneratedValue(generator = "TEM_PER_DIEM_EXP_ID_SEQ") 043 @SequenceGenerator(name = "TEM_PER_DIEM_EXP_ID_SEQ", sequenceName = "TEM_PER_DIEM_EXP_ID_SEQ", allocationSize = 5) 044 @Column(name = "ID", nullable = false) 045 private Integer id; 046 private String documentNumber; 047 private String countryState; 048 private String county; 049 private String primaryDestination; 050 //boolean flag if it gets disabled due to duplicate 051 private Boolean breakfast = Boolean.TRUE; 052 private Boolean lunch = Boolean.TRUE; 053 private Boolean dinner = Boolean.TRUE; 054 private Boolean personal = Boolean.FALSE; 055 private Boolean incidentalsWithMealsOnly; 056 057 private KualiDecimal breakfastValue = KualiDecimal.ZERO; 058 private KualiDecimal lunchValue = KualiDecimal.ZERO; 059 private KualiDecimal dinnerValue = KualiDecimal.ZERO; 060 private KualiDecimal incidentalsValue = KualiDecimal.ZERO; 061 062 @Column(name = "per_diem_id") 063 private Integer perDiemId; 064 065 @ManyToOne 066 @JoinColumn(name = "per_diem_id") 067 //private PerDiem perDiem; 068 069 private Integer miles = new Integer(0); 070 private Timestamp mileageDate; 071 //private MileageRate mileageRate; 072 private Integer mileageRateId; 073 074 private String accommodationTypeCode; 075 private String accommodationName; 076 private String accommodationPhoneNum; 077 private String accommodationAddress; 078 //private AccommodationType accommodationType; 079 080 private KualiDecimal lodging = KualiDecimal.ZERO; 081 private boolean prorated = false; 082 083 public Integer getId() { 084 return id; 085 } 086 087 public void setId(Integer id) { 088 this.id = id; 089 } 090 091 @Column(name = "FDOC_NBR", length = 14, nullable = false) 092 public String getDocumentNumber() { 093 return documentNumber; 094 } 095 096 public void setDocumentNumber(String documentNumber) { 097 this.documentNumber = documentNumber; 098 } 099 100 @Column(name = "COUNTRY", length = 100, nullable = false) 101 public String getCountryState() { 102 return countryState; 103 } 104 105 public void setCountryState(String countryState) { 106 this.countryState = countryState; 107 } 108 109 @Column(name = "COUNTY_CD", length = 100, nullable = false) 110 public String getCounty() { 111 return county; 112 } 113 114 public void setCounty(String county) { 115 this.county = county; 116 } 117 118 @Column(name = "PRI_DEST", length = 100, nullable = false) 119 public String getPrimaryDestination() { 120 return primaryDestination; 121 } 122 123 public void setPrimaryDestination(String primaryDestination) { 124 this.primaryDestination = primaryDestination; 125 } 126 127 @Column(name = "BREAKFAST_IND", nullable = false, length = 1) 128 public Boolean getBreakfast() { 129 return breakfast; 130 } 131 132 public void setBreakfast(Boolean breakfast) { 133 this.breakfast = breakfast; 134 } 135 136 @Column(name = "LUNCH_IND", nullable = false, length = 1) 137 public Boolean getLunch() { 138 return lunch; 139 } 140 141 public void setLunch(Boolean lunch) { 142 this.lunch = lunch; 143 } 144 145 @Column(name = "DINNER_IND", nullable = false, length = 1) 146 public Boolean getDinner() { 147 return dinner; 148 } 149 150 public void setDinner(Boolean dinner) { 151 this.dinner = dinner; 152 } 153 154 /** 155 * Gets the perDiemId attribute. 156 * 157 * @return Returns the perDiemId. 158 */ 159 public Integer getPerDiemId() { 160 return perDiemId; 161 } 162 163 /** 164 * Sets the perDiemId attribute value. 165 * 166 * @param perDiemId The perDiemId to set. 167 */ 168 public void setPerDiemId(Integer perDiemId) { 169 this.perDiemId = perDiemId; 170 } 171 172 /** 173 * Gets the perDiem attribute. 174 * 175 * @return Returns the perDiem. 176 */ 177 /** 178 public PerDiem getPerDiem() { 179 return perDiem; 180 } 181 */ 182 /** 183 * Sets the perDiem attribute value. 184 * 185 * @param perDiem The perDiem to set. 186 */ 187 /** 188 public void setPerDiem(PerDiem perDiem) { 189 this.perDiem = perDiem; 190 191 setupCustomPerDiem(); 192 } 193 */ 194 /** 195 * This method gets the accommodation type code associated with this day 196 * 197 * @return accoomodation type code 198 */ 199 @Column(name = "ACCOM_TYP_CD", length = 4) 200 public String getAccommodationTypeCode() { 201 return accommodationTypeCode; 202 } 203 204 /** 205 * This method sets the accommodation type code for this day 206 * 207 * @param accommodationTypeCode 208 */ 209 public void setAccommodationTypeCode(String accommodationTypeCode) { 210 this.accommodationTypeCode = accommodationTypeCode; 211 } 212 213 /** 214 * This method returns the current accommodation Type for this TripDetailEstimate 215 * 216 * @return accommodation Type 217 */ 218 /** 219 @ManyToOne 220 @JoinColumn(name = "ACCOM_TYP_CD") 221 public AccommodationType getAccommodationType() { 222 return accommodationType; 223 } 224 /* 225 /** 226 * This method is only used for when the object is initially populated from OJB 227 * 228 * @param accommodationType 229 */ 230 /** 231 public void setAccommodationType(AccommodationType accommodationType) { 232 this.accommodationType = accommodationType; 233 } 234 */ 235 /** 236 * This method returns the name of the accommodation for this day 237 * 238 * @return accommodation name 239 */ 240 @Column(name = "ACCOM_NM") 241 public String getAccommodationName() { 242 return accommodationName; 243 } 244 245 /** 246 * This method sets the accommodation name for this day 247 * 248 * @param accommodationName 249 */ 250 public void setAccommodationName(String accommodationName) { 251 this.accommodationName = accommodationName; 252 } 253 254 /** 255 * This method returns the accommodation's phone 256 * 257 * @return the phone number for the accommodation 258 */ 259 @Column(name = "ACCOM_PH") 260 public String getAccommodationPhoneNum() { 261 return accommodationPhoneNum; 262 } 263 264 /** 265 * This method sets the accommodation phone number 266 * 267 * @param accommodationPhoneNum 268 */ 269 public void setAccommodationPhoneNum(String accommodationPhoneNum) { 270 this.accommodationPhoneNum = accommodationPhoneNum; 271 } 272 273 /** 274 * This method returns the accommodation's address 275 * 276 * @return accommodation's address 277 */ 278 @Column(name = "ACCOM_ADDRESS") 279 public String getAccommodationAddress() { 280 return accommodationAddress; 281 } 282 283 /** 284 * This method sets the accommodation's address 285 * 286 * @param accommodationAddress 287 */ 288 public void setAccommodationAddress(String accommodationAddress) { 289 this.accommodationAddress = accommodationAddress; 290 } 291 292 /** 293 * This method gets the lodging cost for this day. This method does not take into account personal expenses. Use getLodgingTotal() for that. 294 * 295 * @return lodging cost 296 */ 297 @Column(name = "LODGING", precision = 19, scale = 2) 298 public KualiDecimal getLodging() { 299 if (ObjectUtils.isNotNull(lodging) && this.lodging.isGreaterThan(KualiDecimal.ZERO)) { 300 return lodging; 301 } 302 303 return KualiDecimal.ZERO; 304 } 305 306 public KualiDecimal getLodging(boolean defaultZero) { 307 return defaultZero? getLodging() : lodging; 308 } 309 310 /** 311 * This method sets the lodging cost for this day 312 * 313 * @param lodging 314 */ 315 public void setLodging(KualiDecimal lodging) { 316 this.lodging = lodging; 317 } 318 319 @Column(name = "MILES", nullable = false) 320 public Integer getMiles() { 321 if (ObjectUtils.isNotNull(miles) && miles > 0) { 322 return miles; 323 } 324 325 return 0; 326 } 327 328 public Integer getMiles(boolean defaultZero) { 329 return defaultZero? getMiles() : miles; 330 } 331 332 public void setMiles(Integer miles) { 333 this.miles = miles; 334 } 335 336 /** 337 * Gets the breakfastValue attribute. 338 * 339 * @return Returns the breakfastValue. 340 */ 341 public KualiDecimal getBreakfastValue() { 342 if (ObjectUtils.isNotNull(breakfastValue) && this.breakfastValue.isGreaterThan(KualiDecimal.ZERO)) { 343 return breakfastValue; 344 } 345 346 return KualiDecimal.ZERO; 347 } 348 349 public KualiDecimal getBreakfastValue(boolean defaultZero) { 350 return defaultZero? getBreakfastValue() : breakfastValue; 351 } 352 353 /** 354 * Sets the breakfastValue attribute value. 355 * 356 * @param breakfastValue The breakfastValue to set. 357 */ 358 public void setBreakfastValue(KualiDecimal breakfastValue) { 359 this.breakfastValue = breakfastValue; 360 } 361 362 /** 363 * Gets the lunchValue attribute. 364 * 365 * @return Returns the lunchValue. 366 */ 367 public KualiDecimal getLunchValue() { 368 if (ObjectUtils.isNotNull(lunchValue) && this.lunchValue.isGreaterThan(KualiDecimal.ZERO)) { 369 return lunchValue; 370 } 371 372 return KualiDecimal.ZERO; 373 } 374 375 public KualiDecimal getLunchValue(boolean defaultZero) { 376 return defaultZero? getLunchValue() : lunchValue; 377 } 378 379 /** 380 * Sets the lunchValue attribute value. 381 * 382 * @param lunchValue The lunchValue to set. 383 */ 384 public void setLunchValue(KualiDecimal lunchValue) { 385 this.lunchValue = lunchValue; 386 } 387 388 /** 389 * Gets the dinnerValue attribute. 390 * 391 * @return Returns the dinnerValue. 392 */ 393 public KualiDecimal getDinnerValue() { 394 if (ObjectUtils.isNotNull(dinnerValue) && this.dinnerValue.isGreaterThan(KualiDecimal.ZERO)) { 395 return dinnerValue; 396 } 397 398 return KualiDecimal.ZERO; 399 } 400 401 public KualiDecimal getDinnerValue(boolean defaultZero) { 402 return defaultZero? getDinnerValue() : dinnerValue; 403 } 404 405 /** 406 * Sets the dinnerValue attribute value. 407 * 408 * @param dinnerValue The dinnerValue to set. 409 */ 410 public void setDinnerValue(KualiDecimal dinnerValue) { 411 this.dinnerValue = dinnerValue; 412 } 413 /** 414 @ManyToOne 415 @JoinColumn(name = "MILEAGE_RT_ID") 416 public MileageRate getMileageRate() { 417 return mileageRate; 418 } 419 420 public void setMileageRate(MileageRate mileageRate) { 421 this.mileageRate = mileageRate; 422 } 423 */ 424 @Column(name = "MILEAGE_RT_ID", precision = 19, scale = 2, nullable = false) 425 public Integer getMileageRateId() { 426 return mileageRateId; 427 } 428 429 public void setMileageRateId(Integer mileageRateId) { 430 this.mileageRateId = mileageRateId; 431 } 432 433 @Column(name = "MILEAGE_TOT", precision = 19, scale = 2, nullable = false) 434 public KualiDecimal getMileageTotal() { 435 KualiDecimal total = KualiDecimal.ZERO; 436 if (!personal) { 437 if (ObjectUtils.isNotNull(this.mileageRateId) && ObjectUtils.isNotNull(this.miles) && this.miles > 0) { 438 this.refreshReferenceObject("mileageRate"); 439 //total = new KualiDecimal(miles).multiply(mileageRate.getRate()); 440 } 441 } 442 443 return total; 444 } 445 446 public KualiDecimal getDailyTotal() { 447 KualiDecimal total = KualiDecimal.ZERO; 448 if (!personal) { 449 total = total.add(this.getMileageTotal()); 450 total = total.add(this.getLodging()); 451 total = total.add(getMealsAndIncidentals()); 452 } 453 454 return total; 455 } 456 457 /** 458 * 459 * This method gets the mealsTotal with 460 * @return 461 */ 462 public KualiDecimal getMealsTotal() { 463 KualiDecimal total = KualiDecimal.ZERO; 464 if (!personal) { 465 if (breakfast) { 466 total = total.add(this.getBreakfastValue()); 467 } 468 if (lunch) { 469 total = total.add(this.getLunchValue()); 470 } 471 if (dinner) { 472 total = total.add(this.getDinnerValue()); 473 } 474 } 475 return total; 476 } 477 478 /** 479 * 480 * This method gets the Lodging Total if it is not a personal expense. 481 * @return 482 */ 483 public KualiDecimal getLodgingTotal() { 484 if (!personal) { 485 return this.getLodging(); 486 } 487 return KualiDecimal.ZERO; 488 } 489 490 /** 491 * Retrieve the Mileage date of per diem 492 * 493 * CLEANUP: mileage date should be the per diem expense date 494 * 495 * @return mileage date 496 */ 497 @Column(name = "MLG_DT") 498 public Timestamp getMileageDate() { 499 return mileageDate; 500 } 501 502 public KualiDecimal getMealsAndIncidentals() { 503 KualiDecimal total = KualiDecimal.ZERO; 504 if (!personal) { 505 total = total.add(getMealsTotal()); 506 total = total.add(getIncidentalsValue()); 507 } 508 return total; 509 } 510 511 512 public static KualiDecimal calculateMealsAndIncidentalsProrated(KualiDecimal total, Integer perDiemPercent) { 513 KualiDecimal percent = new KualiDecimal(perDiemPercent).divide(new KualiDecimal(100)); 514 total = total.multiply(percent); 515 return total; 516 } 517 518 /** 519 * 520 * This method split mealsAndIncidentals into breakfast, lunch, dinner and incidentals (overriding the existing breakfast, lunch, dinner and incidentals values). 521 * @param mealsAndIncidentals 522 */ 523 public void setMealsAndIncidentals(KualiDecimal mealsAndIncidentals) { 524 KualiDecimal meal = mealsAndIncidentals.divide(new KualiDecimal(4)); 525 setBreakfastValue(meal); 526 setLunchValue(meal); 527 setDinnerValue(meal); 528 setIncidentalsValue(mealsAndIncidentals.subtract(getMealsTotal())); 529 } 530 531 /** 532 * This method returns whether or not this is a personal expense or not (true for personal expense, false otherwise) 533 * 534 * @return true for personal expense, false otherwise 535 */ 536 @Column(name = "PERSONAL", nullable = false, length = 1) 537 public Boolean getPersonal() { 538 return personal; 539 } 540 541 /** 542 * This method sets true if this is a personal expense 543 * 544 * @param true for personal expense 545 */ 546 public void setPersonal(Boolean personal) { 547 this.personal = personal; 548 } 549 550 /** 551 * Assign the Mileage date of per diem 552 * 553 * @param mileageDate as Date 554 */ 555 public void setMileageDate(final Timestamp mileageDate) { 556 this.mileageDate = mileageDate; 557 } 558 559 protected LinkedHashMap toStringMapper() { 560 LinkedHashMap map = new LinkedHashMap(); 561 map.put("id", id); 562 map.put("countryState", this.countryState); 563 map.put("county", this.county); 564 map.put("primaryDestination", this.primaryDestination); 565 566 return map; 567 } 568 569 /** 570 public KualiDecimal getDefaultMealsAndIncidentals() { 571 KualiDecimal total = KualiDecimal.ZERO; 572 refreshPerDiem(); 573 if (!personal && this.perDiem != null) { 574 if (breakfast) { 575 total = total.add(new KualiDecimal(this.perDiem.getBreakfast())); 576 } 577 if (lunch) { 578 total = total.add(new KualiDecimal(this.perDiem.getLunch())); 579 } 580 if (dinner) { 581 total = total.add(new KualiDecimal(this.perDiem.getDinner())); 582 } 583 584 // finally add in the incidentals 585 if (getIncludeIncidentals()) { 586 total = total.add(this.perDiem.getIncidentals()); 587 } 588 } 589 return total; 590 } 591 592 593 public void refreshPerDiem() { 594 if (!isCustomPerDiem()) { 595 this.refreshReferenceObject("perDiem"); 596 } 597 598 setupCustomPerDiem(); 599 } 600 */ 601 /** 602 * This method generates a custom perDiem if perDiem is null 603 604 private void setupCustomPerDiem() { 605 if (this.perDiem == null) { 606 this.perDiem = new PerDiem(); 607 this.perDiem.setId(TemConstants.CUSTOM_PER_DIEM_ID); 608 } 609 } 610 611 public boolean isCustomPerDiem() { 612 return this.perDiem == null || this.perDiem.getId() == null ? true : this.perDiem.getId() == TemConstants.CUSTOM_PER_DIEM_ID; 613 } 614 */ 615 /** 616 * This method checks for incidentals inclusion to the mealsAndIncidentals calculation. 617 * 618 * @return 619 */ 620 /** 621 public Boolean getIncludeIncidentals() { 622 return !(!breakfast && !lunch && !dinner && getIncidentalsWithMealsOnly()); 623 } 624 /* 625 /** 626 public Boolean getIncidentalsWithMealsOnly() { 627 if (incidentalsWithMealsOnly == null) { 628 String incidentalsWithMealsOnlyParam = SpringContext.getBean(ParameterService.class).getParameterValue(PARAM_NAMESPACE, DOCUMENT_DTL_TYPE, TravelParameters.INCIDENTALS_WITH_MEALS_ONLY_IND); 629 630 //incidentalsWithMealsOnly = incidentalsWithMealsOnlyParam != null && incidentalsWithMealsOnlyParam.equals(KFSConstants.DocumentTypeAttributes.INDICATOR_ATTRIBUTE_TRUE_VALUE); 631 incidentalsWithMealsOnly = incidentalsWithMealsOnlyParam != null && incidentalsWithMealsOnlyParam.equals(KFSConstants.ParameterValues.YES); 632 } 633 634 return incidentalsWithMealsOnly; 635 } 636 */ 637 public void setIncidentalsWithMealsOnly(Boolean incidentalsWithMealsOnly) { 638 this.incidentalsWithMealsOnly = incidentalsWithMealsOnly; 639 } 640 641 /** 642 * This method returns incidentalsValue affected by INCIDENTALS_WITH_MEALS_ONLY_IND parameter 643 * 644 * @return 645 */ 646 public KualiDecimal getIncidentalsValue() { 647 //if (getIncludeIncidentals()) { 648 if (ObjectUtils.isNotNull(incidentalsValue) && this.incidentalsValue.isGreaterThan(KualiDecimal.ZERO)) { 649 return incidentalsValue; 650 } 651 //} 652 653 return KualiDecimal.ZERO; 654 } 655 656 public KualiDecimal getIncidentalsValue(boolean defaultZero) { 657 return defaultZero? getIncidentalsValue() : incidentalsValue; 658 } 659 660 public void setIncidentalsValue(KualiDecimal incidentalsValue) { 661 this.incidentalsValue = incidentalsValue; 662 } 663 664 public boolean isProrated() { 665 //if(isCustomPerDiem()){ 666 // return false; 667 // } 668 669 return prorated; 670 } 671 672 public void setProrated(boolean prorated) { 673 this.prorated = prorated; 674 } 675 }